2016-03-03 52 views
0

如果我先解釋我的代碼結構,然後嘗試問我的問題,這將是最簡單的。使用MVVM中的自定義mutator將項添加到綁定到ObservableCollection的WPF DataGrid C#

我有一個基類包含一些簡單的屬性。我們將稱這BaseClass。然後我有幾個其他類擴展BaseClass。我們稱之爲SubClass1,Subclass2SubClass3。現在我有這個視圖模型,它包含這個私有成員:

private ObservableCollection<BaseClass> objs = new ObservableCollection<BaseClass>(); 

視圖模型的初始化包含這樣的:現在

objs.Add(new SubClass1(attribute1, attribute2)); 
objs.Add(new SubClass3(attribute1, attribute2)); 
objs.Add(new SubClass1(attribute1, attribute2)); 
objs.Add(new SubClass2(attribute1, attribute2)); 

,在這種情況下,我有3個獨立的數據網格。我想這三個從OBJ文件畫,但我想一個展示型SubClass1,一個只對象,以顯示型SubClass2的唯一對象,最後顯示型SubClass3的唯一對象。我已成功通過創建屬性爲每個如下:

public ObservableCollection<SubClass1> SubClass1Objs 
{ 
    get 
    { 
     ObservableCollection<SubClass1> subObjs = new ObseleCollection<SubClass1>(); 
     if (objs != null) 
      foreach (BaseClass obj in objs) 
       if(obj.GetType() == typeof(SubClass1)) 
       subObjs .Add((SubClass1)obj); 
     return subObjs ; 
    } 
} 

其他2是相同的。我將每個數據網格的ItemSource綁定到它們的屬性。這一切都有效。

用戶當前可以編輯數據網格中的任何項目,並且這些更改將反映在objs中。但是,如果用戶嘗試將項目添加到數據網格,則這些項目不會添加到objs中,並且正確;我的屬性沒有增變器(setter)。這是我的問題所在。我有麻煩提出了什麼樣的mutators看起來像添加一個新的對象的集合。有沒有人有任何想法?謝謝!

+0

需要三個單獨收集看法,並不集合。請參閱ICollectionView接口和ListCollectionView類(很抱歉,很難從手機發布鏈接) – Dennis

+0

您可以使用集合視圖或可觀察集合,但不應在屬性獲取器中創建可觀察集合的新實例,它是問題。在viewmodel級別創建一個單獨的實例,並使用SubClass1實例填充它。添加到該集合的任何對象都將自動出現在網格中,並且如果網格創建新實例,它將自動添加到它綁定的集合中。使用收集更改的事件來檢測這些更改。 – user469104

+0

@Dennis所以你是說,而不是我的屬性被類型ObservableCollection,他們應該是ListCollectionViews類型? – Chris

回答

0

感謝@ user49104我能弄明白。我會在這裏爲所有需要它的人發佈答案。

我改變了我的SubClass1SubClass2SubClass3集合的性質有正常更加正常的存取函數的實現,創造了每一個私有成員:

private ObservableCollection<SubClass1> _SubClass1Objs ; 

public ObservableCollection<SubClass1> SubClass1Objs { 
     get { if (_SubClass1Objs== null) _SubClass1Objs = new ObservableCollection<SubClass1>(); return _SubClass1Objs; } 
     set { if (_SubClass1Objs!= value) { _SubClass1Objs= value; RaisePropertyChanged("SubClass1Objs"); } } 
} 

在初始化我的視圖模型,設置子類數據:

SubClass1Objs= new ObservableCollection<SubClass1>(); 
    if (objs != null) 
     foreach (BaseClass obj in objs.Where(c => c.GetType() == typeof(SubClass1))) 
      SubClass1Objs.Add((SubClass1)card);; 
SubClass1Objs.CollectionChanged += SubClass1Objs_CollectionChanged; 

然後最後,在CollectionChanged事件中,我檢查過,以確保沒有對象被添加或刪除和修復了OBJ文件:

// Check if a card was added 
foreach (SubClass1 obj in SubClass1Objs) 
    if (!objs.Contains(obj)) 
     objs.Add(obj); 

// Check if a card has been deleted 
for (int i = 0; i < objs.Where(c => c.GetType() == typeof(SubClass1)).Count(); ++i) 
{ 
    BaseClass obj = objs.Where(c => c.GetType() == typeof(SubClass1)).ElementAt(i); 
    if (!SubClass1Objs.Contains(obj)) 
     objs.Remove(obj); 
} 
相關問題