2015-05-03 61 views
1

我綁定到WPF應用程序中XAML的屬性,但是此查詢是關於在另一個類/對象中引發另一個類屬性時引發一個類屬性的'PropertyChanged'事件。一個用例是組合框的ItemsSource綁定到一個屬性(在我下面的簡化示例中爲PropB),並且該屬性返回基於其他屬性(下面的PropA)的集合。 B類中的PropB需要在A類中的PropA發生更改時提升PropertyChanged,但A類不會引用B類。將一個屬性綁定到另一個並鏈/火OnPropertyChanged

是否存在現有的方法或框架,以便具有INotifyPropertyChanged對象的屬性時可以引發'OnPropertyChanged'屬性在另一個對象的變化?

下面是想什麼,我用一個虛構的做榜樣「通知」財產屬性作爲綁定路徑:

public class A : NotifyPropertyChanged 
{ 
    string m_PropA; 
    public string PropA 
    { 
     get { return m_PropA; } 
     set 
     { 
      if (m_PropA != value) 
      { 
       m_PropA = value; 
       OnPropertyChanged("PropA"); 
      } 
     } 
    } 
} 

public class B : NotifyPropertyChanged 
{ 
    public A ARef { get; private set; } 

    string m_PropB; 
    [Notify("ARef.PropA")] 
    public string PropB 
    { 
     get { return ARef.PropA; } 
    } 
} 

理想的屬性將創建一個綁定到每個屬性屬性路徑(ARef和PropA),當它們中的任何一個改變時,都會調用類B中的OnPropertyChanged作爲propertyName參數傳遞「PropB」。我假設ARef屬性在更改時也需要引發一個事件,但如果沒有,它會很好。

我猜這將需要一些反射和弱事件監聽。希望有一些我可以使用的東西。如果之前已經回答過,請道歉。

+0

如果有什麼像「ViewModelA」和「ViewModelB」,你可以使用'Mediator'模式的好方法發送消息從一個到另一個。有關該主題的一些文章,如下所示:http://marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/ –

+0

謝謝。我的時間有點短,所以在再讀一遍之前我會問一下 - 當B引用A時,是否需要A向B發送消息?在我上面的例子中,A可以在由包含B的不同程序集引用的程序集中,因此A不能將消息發送給B(即它不知道B)。希望這個問題是有道理的。 – AndrewS

+0

調解器是關於發送消息的對象「可能關注的對象」,通信對象不需要互相「認識」,不需要從「A」到「B」的引用,反之亦然 –

回答

1

提示1(綁定)

  • 變化從路徑= PROPB到路徑= ARef.PropA你的綁定,並添加OnPropertyChanged到阿里夫二傳手在這種情況下,值類B.
  • 當你改變將改變在類B類或PropA AREF屬性甲

提示2(比賽鏈)

  • 在A的設定器(在B)將事件處理程序添加到A類的PropertyChanged事件。n處理程序,當arg包含PropA時提升PropB的PropertyChangedEvent。
  • 手冊事件火是忘東西,並把你的應用程序混亂
+0

感謝您的回答。 Tip1不適用於我的真實世界的情況,因爲PropB可能會基於多個其他屬性派生一個值,而不是直接返回ARef.PropA的值。 Tip2聽起來像是一個事件鏈的手動版本,我寧願以更簡潔,更安全的方式來處理弱事件。 – AndrewS

+0

如果PropB基於多個其他屬性並且它們具有PropertyChangedEvent,則可以使用Multibinding和MultiValueConverter。 – sac1

+0

對不起,我應該說'源於'。PropB根據其他屬性的狀態生成一個值。例如,PropB可能會返回數據庫表名稱列表,並且PropA可能是某些數據庫連接詳細信息(如服務器)的一部分。當PropA或RefA發生更改時(包括使用PropertyChanged事件運行時未使用UI的模型中的其他對象),任何綁定到PropB的東西都需要重新查詢。 – AndrewS

相關問題