【发布时间】: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 无论如何,如果您想将其作为快速答案发布,我会接受。