【发布时间】:2012-07-23 12:09:13
【问题描述】:
当自定义 UserControl 的目标 DependencyProperty 更改时,绑定源未更新。
源是一个用 MEF 加载到我的自定义 UserControl 的 DataContext 中的 ViewModel。
我的绑定在 MyUserControl 的根 XAML 中如下所示
// MyUserControl.xaml
<MyUserControlBase x:Class="MyUserControl" MyDependencyProperty="{Binding ViewModelProperty}">
如果我将 MyDependencyProperty 与 FrameworkPropertyMetadata 一起使用并在属性更改时使用回调函数,我可以执行以下操作,效果很好
// MyUserControlBase.cs
private static void MyDependencyProperty_Changed(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
{
var filter = (UserControl )depObj;
var vm = (ViewModel)filter.DataContext;
vm.ViewModelProperty= (VMPropType)args.NewValue;
}
在继承 UserControl 的 MyUserControlBase 中注册 DependencyProperty。
// MyUserControlBase.cs
public static readonly DependencyProperty MyDependencyPropertyProperty = DependencyProperty.Register("MyDependencyProperty",
typeof(VMPropType),
typeof(MyUserControlBase),
new FrameworkPropertyMetadata(null, MyDependencyProperty_Changed));
但是为什么我不能在 XAML 中完成简单的双向绑定工作?
输出窗口显示没有绑定失败。我可以看到正在调用 ViewModel.ViewModelProperty getter。一旦 MyDependencyProperty 发生变化,就不是 setter。
这似乎不是事件顺序的问题。 ViewModel 是在 DependencyProperty 第一次更改之前创建的。
我也看过Setting up binding to a custom DependencyProperty inside a WPF user control 但他的问题似乎略有不同,因为我实际上是从我自己的持有 DependencyProperty 的 Base 类继承而来的。
感谢您的帮助。
编辑:带有示例解决方案的链接。 Solution zip here
抱歉,链接看起来很吓人,我不知道很多快速文件共享网站。如果它的评论不好,我会尽快删除它,但它似乎没问题。
【问题讨论】:
-
请在您注册依赖属性的地方发布代码。
标签: wpf user-controls dependency-properties