2017-05-03 63 views
2

是否可以将多个(双向)源绑定附加到依赖项属性?也就是说,如果一个源发生更改,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 
}); 

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

+1

如果'SelectedInternal'是另一个依赖属性,则可以反转绑定方向。除此之外,目前尚不清楚为什么你有这种内部视图模型。 UserControls通常不应该有一个内部视图模型。 – Clemens

+0

@Clemens我的确考虑过摆脱内部视图模型。那是通常编写库控件的方式,没有视图模型,而是代码控制的代码隐藏?但是如果我想坚持使用MVVM模式呢?也许是不可能的。 – McGarnagle

+1

只有内部和私人的模式是没有用的。你也可以在你的控件的代码后面添加私有属性。 – Clemens

回答

1

这是否被推翻?

为什么不简单地在自定义控件背后的代码中执行管道并放弃绑定?

这可以通过

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

您在控件上创建虚拟机,以便您可以访问虚拟机及其属性,该虚拟机及其属性可以为双向传输提供数据的矢量化。


在一天结束时,绑定只是通过反射获得参考。在这种情况下,如何获得参考对于简单地在两个属性之间来回编写而言并不重要。

或者我错过了什么?

+0

是的,你是对的 - 可能是过度思考/试图遵循不适用的MVVM模式的情况。 – McGarnagle

+0

@McGarnagle,我确实了解,并且自己一直在那里考虑一条可以说是高速公路的特定路线,而没有看到另一条路。 :-) – OmegaMan