3

所以我使用WPFMVVM的方式使用Caliburn.Micro作爲框架。可觀察綁定到兩個ICollectionView的同一集合

我有一個ViewModel與ObservableCollection,我需要顯示兩次不同的排序,過濾和分組。

我很難過這種所謂的簡單行動。我通常會這樣做:

private ICollectionView _datagridCollectionView; 
public ICollectionView DatagridCollectionView 
{ 
    get 
    { 
     if (this._datagridCollectionView == null) 
     { 
      this._datagridCollectionView = CollectionViewSource.GetDefaultView(this.Items); 
      using (this._datagridCollectionView.DeferRefresh()) 
      { 
       this._datagridCollectionView.SortDescriptions.Clear(); 
       this._datagridCollectionView.SortDescriptions.Add(new SortDescription("SortingProperty", ListSortDirection.Ascending)); 
      } 
     } 
     return this._datagridCollectionView; 
    } 
} 

它工作正常,它排序,它是可觀察的。

所以我加了第二種觀點是相同的:

private ICollectionView _chartCollectionView; 
public ICollectionView ChartCollectionView 
{ 
    get 
    { 
     if (this._chartCollectionView == null) 
     { 
      this._chartCollectionView = CollectionViewSource.GetDefaultView(this.Items); 
      using (this._chartCollectionView.DeferRefresh()) 
      { 
       this._chartCollectionView.Filter = (p) => { return p.IsChartable; }; 
      } 
     } 
     return this._chartCollectionView; 
    } 
} 

現在的問題是(可能是因爲我訪問默認視圖,因此具有相同的參考),所有排序/過濾做是爲了兩個視圖。

所以我試圖做的ICollectionView新的實例,但CollectionView不應該被用來和ListCollectionView由列表和不IEnumarbles所以我即使我使用ToList()方法的意見是不再觀察到。

什麼是正確的方法來做到這一點?

+1

您是否嘗試過按照'CollectionView'類的文檔備註中所述的建議? *若要爲僅實現「IEnumerable」的集合創建集合視圖,請創建一個「CollectionViewSource」對象,將集合添加到Source屬性,並從View屬性獲取集合視圖。* – 2013-05-13 11:45:37

+0

@DanielHilgarth Absolutely ,但你的答案指出我在那裏犯的錯誤,我直接綁定到CollectionViewSource而不是它的View屬性,這很好。也許你不想提交這個答案?當你這樣做時,你是否使用CollectionViewSource或它的View屬性進行排序。過濾器似乎必須直接應用於View屬性。 – 2013-05-13 11:58:14

回答

2

您應該使用在CollectionView類的文檔的備註部分介紹的方法:

要創建一個集合,它僅實現IEnumerable集合視圖中創建一個CollectionViewSource對象,你的收藏添加到Source屬性,並從View屬性獲取收集視圖。

這種做法等同於CollectionViewSource.GetDefaultView,即你將使用檢索View一樣的:

  • 將其綁定到UI
  • 你用它來過濾
  • 您使用它來排序
相關問題