当自定义 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 第一次更改之前创建的。
我还查看了在WPF 用户控件中设置绑定到自定义 DependencyProperty 但他的问题似乎略有不同,因为我实际上是从我自己的持有 DependencyProperty 的基类继承的。
感谢您的任何帮助。
编辑:带有示例解决方案的链接。 解决方案 zip 在这里
抱歉,链接看起来很吓人,我不知道很多快速文件共享网站。如果它的评论不好,我会尽快删除它,但它似乎没问题。