我有以下結構: 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