【问题标题】:Multiple sources bound to same target dependency property多个源绑定到相同的目标依赖属性
【发布时间】:2017-05-03 20:43:11
【问题描述】:

是否可以将多个(双向)源绑定附加到依赖属性?也就是说,如果一个源发生更改,则 DP 通过一个绑定更新,然后更改将通过第二个绑定传播到第二个源。

在我的场景中,依赖属性在用户控件中,第一个绑定是到它的内部视图模型,第二个绑定是针对用户控件消费者的视图模型。


以下是为了说明。用户控件的使用者如下所示:

<MyControl SelectedValue="{Binding Selected,Mode=TwoWay}" />

现在“MyControl”将“SelectedValue”定义为依赖属性。控件的 XAML 绑定到它的依赖属性,如下所示:

<UserControl>
    <Grid x:Name="LayoutRoot">
        <TextBox Text="{Binding SelectedValue,Mode=TwoWay,
               RelativeSource={RelativeSource AncestorType=UserControl}}" 
          />
    </Grid>
</UserControl>

“MyControl”在控件的构造函数中将其内部数据上下文设置为自己的视图模型:

LayoutRoot.DataContext = new ViewModelForControl();

到目前为止一切都很好,但是如果我尝试添加第二个绑定,即内部视图模型上“SelectedInternal”属性的依赖属性--

SetBinding(SelectedValueProperty, new Binding("SelectedInternal") {
    Source = LayoutRoot.DataContext,
    Mode = BindingMode.TwoWay
});

-- 然后第一个绑定被销毁。有没有办法在保留第一个绑定的同时添加第二个绑定?

【问题讨论】:

  • 如果SelectedInternal 是另一个依赖属性,您可以反转绑定方向。除此之外,还不清楚为什么你有那个内部视图模型。 UserControls 通常不应该有内部视图模型。
  • @Clemens 我确实考虑过摆脱内部视图模型。这就是库控件通常是如何编写的,没有视图模型,而是在控件的代码隐藏中编写代码?但是如果我想坚持 MVVM 模式怎么办?只是不可能,也许吧。
  • 当模式只是内部的并且因此是私有的时,它是没有用的。您也可以将私有属性添加到您的控件代码后面。
  • @Clemens 我明白你的意思是让内部视图模型成为依赖对象并反转绑定方向。这也是个好主意……
  • @Clemens 无论如何,如果您想将其作为快速答案发布,我会接受。

标签: c# wpf xaml


【解决方案1】:

这是不是想多了?

为什么不简单地在自定义控件后面的代码中进行检查并放弃绑定?

这可以通过

  1. SelectedValue 依赖属性将利用其更改的处理程序,并在任何更改时将 SelectedInternal 设置为新值。
  2. SelectedInternal 更改时写入属性SelectedValue

您在控件上创建 VM,因此您可以访问 VM 及其属性,这可以提供数据的矢量化以进行双向传输。


最终,绑定只是通过反射获得引用。在这种情况下,如何获得引用对于简单地在两个属性之间来回写入无关紧要。

还是我错过了什么?

【讨论】:

  • 是的,你是对的 - 可能是过度思考/试图遵循不适用的 MVVM 模式。
  • @McGarnagle,我确实理解并且我自己也曾去过那里,人们正在考虑一条特定的路线,可以说是走 high 路,而没有看到另一条路。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2011-03-05
  • 1970-01-01
  • 2016-01-22
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多