2012-04-26 88 views
1

我有以下結構: Window1 - > UserControlA - > UserControlB - > UserControlC如何讓物業變更泡沫?

每個都有自己的視圖模型。我如何在UserControlA上創建一個屬性取決於UserControlC的屬性?

我能想到的唯一的事情是從B中暴露C的屬性改變的事件,所以我可以偵聽來自A的C事件並更新A的依賴屬性。問題是這看起來太方便了,所以我認爲必須有一個更簡單的解決方案。

回答

1

您可以鏈接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屬性。

+0

的一部分,您能舉個例子來使用可用的EventAggregator機制? – Manuel 2012-04-27 05:17:38

+0

編輯答案 – gaurawerma 2012-04-27 05:56:19

+0

對不起,我以爲我明白了這一點。當我在控件C上創建一個DP時,「TextC」屬性獲取/設置「TextCProperty」。我如何將其映射到viewmodel屬性? – Manuel 2012-04-28 05:04:54

1

有兩件事情可以做:

  1. 隨你在問題中提到:讓每一個家長觀察其子。

  2. 使用RoutedEvents:基於C暴露a RoutedEvent和處理它A.

編輯

多想想你的問題後:

如果它是視圖模型的屬性你想冒泡的C只能使用第一個選項,因爲RoutedEvents只在UI控件上受支持。