关于 c#:WPF – DependencyProperty 忽略设置器,对更改有副作用
WPF - DependencyProperty ignoring setter with side-effects on change
我有一个 WPF 用户控件,它是另外两个控件的package器,根据情况只显示其中一个。它拥有一个
我创建了一个
我怎样才能让底层控件在依赖属性更改时设置其属性?
|
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); } } } |
相关讨论
- 是否设置了属性的值但可能没有提升到 UI?此外,您将属性声明为只读,这将阻止分配给它,除非在同一类的构造函数或声明中。有关只读的更多信息,请参见此处。
您必须将 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; if (list == null || s == null) return; |
相关讨论
- 这似乎成功了。谢谢。
-
这里显示的设置器是错误的。它必须调用
SetValue(ItemsSourceProperty, value) 而没有别的。有关详细信息,请参阅 XAML 加载和依赖属性。 - 所以 setter 上的逻辑必须移到回调中?
- @RenanGemignani 正是。不知道你怎么能接受这个答案。
- 我刚刚测试了它,它似乎工作。
-
还有两个笔记。检查
e.NewValue 和list 是否为空是多余的。您只能检查list 。然后,动态转换d as AccountSelector 在这里是错误的,因为您希望在 d 中有一个 AccountSelector 实例,而没有别的。其他一切都是错误,应该引发InvalidCastException 。所以最好写var s = (AccountSelector)d 。 -
最后,没有必要使用
UIPropertyMetadata 。你也可以使用普通的PropertyMetadata 。