WPF用户控件依赖属性设置器未触发

5

可能是重复问题:
WPF: XAML属性声明未通过Setters设置?

我遇到了一个看似简单的问题。

我有一个名为MyControl.xaml的用户控件,而MyControl.xaml.cs定义了一个公共依赖属性:

public static readonly DependencyProperty VisibleItemsProperty =
    DependencyProperty.Register("VisibleItems", typeof(object), typeof(MyControl));

public object VisibleItems
{
    get { return (object)GetValue(VisibleItemsProperty); }
    set { SetValue(VisibleItemsProperty, value); }
}

在另一个视图 SomeOtherViewA 中,我声明了我的控件:

<cc:MyControl VisibleItems="{Binding VisibleTables}"  />

VisibleTables是SomeOtherViewModelA视图模型上的依赖属性。

我知道VisibleTables返回值,因为它绑定到SomeOtherViewA中的其他控件(如ListBox),并且它们可以正常工作。

但由于某种原因,在我的自定义用户控件中,依赖属性从未被设置。我是否遗漏了一些明显的东西?


我也注意到了这种行为,只是假设这与XAML如何被WPF引擎评估和DP机制有关,这就是为什么我不再乱动DP的设置器了。有趣的问题,想知道它是如何工作的。 - H.B.
你的意思是在你的Dependency Property中使用typeof(MyControl),而不是typeof(SpyFilterList)吗? - aqwert
是的,我更改了名称以简化我的问题。已经调整了我的帖子,谢谢! - Sonic Soul
1个回答

4

我认为我刚刚找到了一个重复的问题

关于这个问题,MSDN 上有更多说明:

当加载二进制 XAML 并处理作为依赖属性的属性时,WPF XAML 处理器使用属性系统方法来处理依赖属性。这实际上绕过了属性包装器。当您实现自定义依赖属性时,您必须考虑此行为,并应避免在属性包装器中放置除属性系统方法 GetValue 和 SetValue 之外的任何其他代码。

SetValue 直接被调用,那些包装器属性只是为了方便在代码后台中使用)


有趣。不是很直观。必须适应新的现实! - Sonic Soul
是的,真正令人着迷的是,WPF实际上并不调用您的setter/getter,但如果您遗漏它们,它仍将无法编译。 - Robert Levy
@Robert Levy:你确定不是你的上下文对包装器的依赖导致它无法编译吗?我刚试过定义一个孤立的 DP,它可以正常工作,可以使用 SetValue 方法绑定并更改其值。 - H.B.
可以想象XAML解析器将一个Binding实例分配给你的VisibleItems属性。由于VisibleItems是一个对象,而不是Binding,因此GetValue / SetValue方法允许DependencyObject支持对象或Binding的值。 - Ed Chapel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接