我有一个源自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;
}
}
似乎两种方式都一样,但我不知道是否有任何隐藏的问题。
答案 0 :(得分:1)
您不能在依赖项属性的CLR包装器中调用除GetValue
和SetValue
之外的任何内容。原因在MSDN上的XAML Loading and Dependency Properties文章中进行了解释。
您可以在基类依赖项属性字段上调用AddOwner
来注册另一个PropertyChangedCallback
,而不是添加新的CLR包装器:
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;
}
}
}