我有以下结构: Window1 - > UserControlA - > UserControlB - > UserControlC如何让物业变更泡沫?
每个都有自己的视图模型。我如何在UserControlA上创建一个属性取决于UserControlC的属性?
我能想到的唯一的事情是从B中暴露C的属性改变的事件,所以我可以侦听来自A的C事件并更新A的依赖属性。问题是这看起来太方便了,所以我认为必须有一个更简单的解决方案。
我有以下结构: Window1 - > UserControlA - > UserControlB - > UserControlC如何让物业变更泡沫?
每个都有自己的视图模型。我如何在UserControlA上创建一个属性取决于UserControlC的属性?
我能想到的唯一的事情是从B中暴露C的属性改变的事件,所以我可以侦听来自A的C事件并更新A的依赖属性。问题是这看起来太方便了,所以我认为必须有一个更简单的解决方案。
您可以链接Dependency Properties
来实现此目的。您需要在所有用户控件中公开dp。将UserControlC
的属性与UserControlB
绑定,然后UserControlA
。通过这种方式,只要UserControlC
中的财产发生更改,UserControlA
中的财产也会发生更改。
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文本被更改时,绑定更新TextA的值。当然,你必须在他们的控制模板中映射dp和他们相应的viewmodel属性。
有两件事情可以做:
随你在问题中提到:让每一个家长观察其子。
使用RoutedEvents:基于C暴露a RoutedEvent和处理它A.
编辑
多想想你的问题后:
如果它是视图模型的属性你想冒泡的C只能使用第一个选项,因为RoutedEvents只在UI控件上受支持。
一个简单的解决办法可能是,为棱http://compositewpf.codeplex.com/
的一部分,您能举个例子来使用可用的EventAggregator机制? – Manuel 2012-04-27 05:17:38
编辑答案 – gaurawerma 2012-04-27 05:56:19
对不起,我以为我明白了这一点。当我在控件C上创建一个DP时,“TextC”属性获取/设置“TextCProperty”。我如何将其映射到viewmodel属性? – Manuel 2012-04-28 05:04:54