我有以下结构:Window1 -> UserControlA -> UserControlB -> UserControlC
每个都有自己的视图模型。如何在 UserControlA 上创建依赖于 UserControlC 属性的属性?
我唯一能想到的就是从 B 公开 C 的属性更改事件,这样我就可以从 A 监听 C 的事件并更新 A 的依赖属性。问题是这似乎太做作了,所以我认为必须有一个更简单的解决方案。
我有以下结构:Window1 -> UserControlA -> UserControlB -> UserControlC
每个都有自己的视图模型。如何在 UserControlA 上创建依赖于 UserControlC 属性的属性?
我唯一能想到的就是从 B 公开 C 的属性更改事件,这样我就可以从 A 监听 C 的事件并更新 A 的依赖属性。问题是这似乎太做作了,所以我认为必须有一个更简单的解决方案。
你可以做两件事:
按照你在问题中提到的做:让每个父母观察自己的孩子。
使用 RoutedEvents:在 C 上公开一个 RoutedEvent并在 A 上处理它。
编辑
在考虑了您的问题之后:
如果它是您想要冒泡的 C 的 ViewModel 的属性,则只能使用第一个选项,因为 RoutedEvents 仅在 UI 控件上受支持。
您可以链接Dependency Properties
来实现这一点。您需要在所有用户控件中公开 dp 。绑定UserControlC
withUserControlB
和 then的属性UserControlA
。这样,每当更改 in 属性时UserControlC
,属性 inUserControlA
也会更改。
a.xaml.cs
class VewModelA : INotifyPropertyChanged
{
prop TextA {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextA")}
}
b.xaml.cs
class ViewModelB : INotifyPropertyChanged
{
prop TextB {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextB")}
}
C.xaml.cs
class ViewModelC : INotifyPropertyChanged
{
prop TextC {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextC")}
}
A.xaml
<controls:B TextB={Binding TextA, Mode=TwoWay}" />
B.xaml
<controls:C TextC={Binding TextB, Mode=TwoWay}" />
每当更改 C 的 Text 时,绑定都会更新 TextA 的值。当然,您必须在控制模板中将 dp 与其相应的视图模型属性进行映射。
一个简单的解决方案可能是使用作为 Prism http://compositewpf.codeplex.com/的一部分提供的 EventAggregator 机制