2013-09-05 39 views
0

我有視圖模型類A,它具有屬性「a」。如何在另一視圖模型中捕捉甚至是一個視圖模型的屬性

和我有班級稱爲B,它具有性能「b」,其中我存儲列表中的所有A []列表。

如果在屬性的任何變化,我想改變父類A.

B類 {

屬性B1的屬性;

列表A []

}

A類 {

屬性A1;

}

我使用MVVM並通知物業chnaged事件有兩個地方。我不知道如何連接兩者。

+0

你的意思是,如果類A的任何實例的屬性'a'有變化,你需要在類B中通知? – Nitin

+0

是的。我需要相同的 –

回答

0

在延伸ObservableCollection<T>BaseCollection類,我有一個創建了一個CollectionItemPropertyChangeddelegate,我可以附加一個處理程序,所以,當屬性值已在任何項目集合中改變了我可以通知:

public delegate void ItemPropertyChanged(T item, string propertyName); 

然後我加入delegate類型的getter和setter:

public virtual ItemPropertyChanged CurrentItemPropertyChanged { get; set; } 

要做到這一點,我必須附加手柄R鍵每個項目的PropertyChanged事件:

public BaseCollection(IEnumerable<T> collection) 
{ 
    foreach (T item in collection) Add(item); 
} 

public new void Add(T item) 
{ 
    item.PropertyChanged += Item_PropertyChanged; 
    base.Add(item); 
} 

我還需要刪除的處理程序時,被刪除的對象:

public new bool Remove(T item) 
{ 
    if (item == null) return false; 
    item.PropertyChanged -= Item_PropertyChanged; 
    return base.Remove(item); 
} 

再有就是Item_PropertyChanged處理程序:

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (CollectionItemPropertyChanged != null) CollectionItemPropertyChanged(
currentItem, e.PropertyName); 
} 

那麼這可以用於你的班級B像這樣:

public List<A> Items 
{ 
    get { return items; } 
    set 
    { 
     items = value; 
     items.CollectionItemPropertyChanged += YourHandler; 
     NotifyPropertyChanged(Items); 
    } 
} 

那麼你的處理程序:

private void YourHandler(A item, string propertyName) 
{ 
    // propertyName is the name of the changed property from the A object named item 
} 

更直接地回答你的問題,你可以從一個視圖模型附加一個處理這一delegate在另一...例如:

Items.CollectionItemPropertyChanged += ViewModel2.YourHandler; 

還是從其他視圖模型:

ViewModel1.Items.CollectionItemPropertyChanged += YourHandler; 
-1

創建視圖模型A作爲獨立的,並使用該實例更新的屬性。

相關問題