包装继承依赖项的正确方法 属性
The Correct Way to Wrap an Inherited Dependency Property
我有一个派生自 ToggleButton
的自定义控件,我想在基础 class 上包装一个 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 文章解释了原因。
您可以在基础 class 依赖项 属性 字段上调用 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;
}
}
}
我有一个派生自 ToggleButton
的自定义控件,我想在基础 class 上包装一个 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 文章解释了原因。
您可以在基础 class 依赖项 属性 字段上调用 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;
}
}
}