正确的方式来包装一个继承的依赖属性
问题描述:
我有一个自定义控件,派生自ToggleButton
,我想在基类上包装一个DP。
我需要做到这一点...正确的方式来包装一个继承的依赖属性
public new bool IsEnabled
{
get { return (bool)GetValue(IsEnabledProperty); }
set
{
SetValue(IsEnabledProperty, value);
if (value && IsChecked == null)
IsChecked = false;
}
}
,或者这是确定...
public new bool IsEnabled
{
get { return base.IsEnabled; }
set
{
base.IsEnabled = value;
if (value && IsChecked == null)
IsChecked = false;
}
}
看来工作相同的两种方式,但我不知道是否有任何隐藏的问题。
答
在依赖项属性的CLR包装中,您不得调用GetValue
和SetValue
以外的其他任何内容。原因在MSDN上的XAML Loading and Dependency Properties文章中有解释。
,而不是新增CLR包装的,你可以调用AddOwner
基类依赖属性字段来注册另一个PropertyChangedCallback
:
public class MyToggleButton : ToggleButton
{
static MyToggleButton()
{
IsEnabledProperty.AddOwner(typeof(MyToggleButton),
new FrameworkPropertyMetadata(IsEnabledPropertyChanged));
}
private static void IsEnabledPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var myToggleButton = (MyToggleButton)o;
if ((bool)e.NewValue && !myToggleButton.IsChecked.HasValue)
{
myToggleButton.IsChecked = false;
}
}
}
OK,是有道理的,我额外的逻辑是一样的元素中,只有当基本DP改变,所以这是完美的。 –
澄清一点:AddOwner的第二个参数的类型是PropertyMetadata,当没有特定的重载要告诉它时,AddOwner如何知道提供了哪些元数据(从我能在文档中找到的内容) ...)? –
这些都在[备注部分](https://msdn.microsoft.com/en-us/library/ms597484(v=vs.110).aspx)(最后一段)中解释。 – Clemens