WPF - DependencyProperty 忽略 setter 对更改有副作用
WPF - DependencyProperty ignoring setter with side-effects on change
我有一个 WPF 用户控件,它是另外两个控件的包装器,根据情况只显示其中一个。它拥有一个 ItemsSource
属性,它为两个基础控件设置 ItemsSource
。我想让这个 属性 可以绑定到 .xaml 文件。
我创建了一个 DependencyProperty
,并且更改了我的 getter 和 setter 以使用它。但是,当我调试代码时,我可以看到 setter 永远不会被调用。我可以看到依赖项 属性 正在更改其值,但它没有设置基础控件的属性。
当依赖项 属性 发生变化时,我该如何设置底层控件的属性?
public partial class AccountSelector : UserControl
{
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
"ItemsSource", typeof(IEnumerable), typeof(AccountSelector));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourceProperty);
}
set
{
if (UseComboBox)
AccCombo.ItemsSource = value;
else
AccComplete.ItemsSource = value;
SetValue(ItemsSourceProperty, value);
}
}
}
您必须将 propertyChangedCallback 传递给您的 UIPropertyMetadata,如下所示:
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
"ItemsSource", typeof(IEnumerable), typeof(AccountSelector), new UIPropertyMetadata((d, e) =>
{
if (e.NewValue == null) return;
var s = d as AccountSelector;
var list = e.NewValue as IEnumerable;
if (list == null || s == null) return;
if (s.UseComboBox)
s.AccCombo.ItemsSource = list;
else
s.AccComplete.ItemsSource = list;
}));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourceProperty);
}
set
{
SetValue(ItemsSourceProperty, value);
}
}
我有一个 WPF 用户控件,它是另外两个控件的包装器,根据情况只显示其中一个。它拥有一个 ItemsSource
属性,它为两个基础控件设置 ItemsSource
。我想让这个 属性 可以绑定到 .xaml 文件。
我创建了一个 DependencyProperty
,并且更改了我的 getter 和 setter 以使用它。但是,当我调试代码时,我可以看到 setter 永远不会被调用。我可以看到依赖项 属性 正在更改其值,但它没有设置基础控件的属性。
当依赖项 属性 发生变化时,我该如何设置底层控件的属性?
public partial class AccountSelector : UserControl
{
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
"ItemsSource", typeof(IEnumerable), typeof(AccountSelector));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourceProperty);
}
set
{
if (UseComboBox)
AccCombo.ItemsSource = value;
else
AccComplete.ItemsSource = value;
SetValue(ItemsSourceProperty, value);
}
}
}
您必须将 propertyChangedCallback 传递给您的 UIPropertyMetadata,如下所示:
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
"ItemsSource", typeof(IEnumerable), typeof(AccountSelector), new UIPropertyMetadata((d, e) =>
{
if (e.NewValue == null) return;
var s = d as AccountSelector;
var list = e.NewValue as IEnumerable;
if (list == null || s == null) return;
if (s.UseComboBox)
s.AccCombo.ItemsSource = list;
else
s.AccComplete.ItemsSource = list;
}));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourceProperty);
}
set
{
SetValue(ItemsSourceProperty, value);
}
}