Wpf 在自定义usercontrol中使用DependencyProperty更新源

Wpf 在自定义usercontrol中使用DependencyProperty更新源,wpf,user-controls,dependency-properties,Wpf,User Controls,Dependency Properties,当自定义UserControl的目标DependencyProperty更改时,我得到一个绑定源未更新 源代码是一个ViewModel,它与MEF一起加载到自定义UserControl的DataContext中 // MyUserControlBase.cs public static readonly DependencyProperty MyDependencyPropertyProperty = DependencyProperty.Register("MyDependencyProper

当自定义UserControl的目标DependencyProperty更改时,我得到一个绑定源未更新

源代码是一个ViewModel,它与MEF一起加载到自定义UserControl的DataContext中

// MyUserControlBase.cs
public static readonly DependencyProperty MyDependencyPropertyProperty = DependencyProperty.Register("MyDependencyProperty",
            typeof(VMPropType),
            typeof(MyUserControlBase),
            new FrameworkPropertyMetadata(null, MyDependencyProperty_Changed));
我的绑定在MyUserControl的根XAML中看起来像这样

// MyUserControl.xaml
<MyUserControlBase x:Class="MyUserControl" MyDependencyProperty="{Binding ViewModelProperty}">
在继承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之前很久创建的

我也看过 但他的问题似乎略有不同,因为我实际上继承了自己的基类,该基类持有DependencyProperty

谢谢你的帮助

编辑:带有示例解决方案的链接。


对不起,这个看起来很吓人的链接,我不知道有多少快速文件共享站点。如果有不好的帖子评论,我会尽快删除,但看起来还可以。

回答更新/删除不相关的信息

在查看了示例中的代码之后,我看到了问题所在。您有这个“选择器”控件。在
BindDependencies
方法中,您可以在
MyControlBase.MyDependencyProperty
上设置绑定。但同时您也将此属性绑定到控件的datacontext(在
MyUserControl.xaml
中)。实际上,这意味着在
BindDependencies
方法中,您正在覆盖对viewmodel的绑定,因此在该方法之后它不会处于活动状态-您可以通过在
SetBinding
调用之前和之后打断并调用
BindingOperations.GetBindingExpression来查看这一点(control,MyUserControlBase.MyPropertyDependencyProperty)
-绑定不同。这就是代码不起作用的原因。我想您必须找到另一种方法在那里传递值:)

一些附加信息

在WPF中,属性只能是一个绑定的目标。这实际上是非常合乎逻辑的-如果一个属性绑定到两个源-它应该使用哪一个?在这种情况下,绑定被标记为
OneWayToSource
这一事实并不重要,因为它仍然被视为针对控件属性的绑定


您可以通过实现自己的
IMultiValueConverter
来调查并查看它是否适合您的一种方法是-它确实允许将控件的属性绑定到多个源。您可以在MSDN上提供的链接中找到更多信息。

是否将ViewModelProperty作为常规属性公开

通常你会做以下事情

public static readonly DependencyProperty ViewModelPropertyProperty = DependencyProperty.Register("ViewModelProperty", 
            typeof(VMPropType), 
            typeof(MyUserControlBase), 
            new FrameworkPropertyMetadata(null, ViewModelProperty_Changed)); 

public VMPropType ViewModelProperty {
    get { return (VMPropType)GetValue(ViewModelPropertyProperty); }
    set { SetValue(ViewModelPropertyProperty,value); }
}
编辑——在评论之后


您什么时候检查属性是否已更改?默认情况下,WPF绑定仅在值失去焦点时更新这些值,您可以更改绑定的UpdateSourceTrigger属性以更改此行为。

请在注册依赖项属性的位置发布代码。在MyUserControlBase_Changed方法中,该方法是DependencyProperty的register方法的回调。DependencyPropertyChangedEventArgs.NewValue显示正确。它只是不更新我的XAML绑定源。我已尝试使用UpdateSourceTrigger=PropertyChanged。是否可以在ViewModelProperty的实际setter中添加一个检查。可能是您检查得太早,而更改还没有级联通过。我已经这样做了,但只有在我执行“new MyUserControl()时,它才会受到影响“MEF将创建ViewModel。我得到一个返回null的两个get和一个赋值null的集合。之后,我看到MyUserControlBase.MyDependencyProperty_上的一个proc发生了更改,其中参数包含正确的值。但是我的ViewModel中没有任何更改。