0

当自定义 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 在这里

抱歉,链接看起来很吓人,我不知道很多快速文件共享网站。如果它的评论不好,我会尽快删除它,但它似乎没问题。

4

2 回答 2

0

您是否将 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 属性以更改此行为。

于 2012-07-23T13:15:08.333 回答
0

答案已更新/无关信息已删除

查看示例中的代码后,我看到了问题所在。你有这个“选择器”控件。在BindDependencies您设置绑定的方法中MyControlBase.MyDependencyProperty。但同时您也将此属性绑定到控件的数据上下文(在 中MyUserControl.xaml)。实际上,这意味着在该BindDependencies方法中,您正在覆盖与视图模型的绑定,因此在该方法之后它不活动 - 您可以通过在调用之前和之后闯入SetBinding和调用来自己看到这一点BindingOperations.GetBindingExpression(control, MyUserControlBase.MyPropertyDependencyProperty)- 绑定是不同的。这就是您的代码不起作用的原因。我想你将不得不找到另一种在那里转移价值的方式:)

一些附加信息

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

您可以调查并查看它是否适合您的一种方法是MultiBinding - 它确实允许通过实现您自己的IMultiValueConverter. 您可以在 MSDN 上提供的链接中找到更多信息。

于 2012-07-23T12:47:56.503 回答