2017-09-21 35 views
0

我使用我的ViewModel中定義的CompositeCollection將(各種類型的)形狀呈現給Canvas。我從我的底層數據創建了幾個ICollectionView。CompositeCollection中的ICollectionView

// ViewModel 
ICollectionView view1 = new CollectionViewSource() { Source = ObservableCollectionA }.View; 
view1.Filter = ... 

我然後創建一個CompositeCollection到在XAML結合:

_CompositeCollection = new CompositeCollection(); 
var container = new CollectionContainer() { Collection = viewModel.view1 }; 
_CompositeCollection.Add(container); 

在視圖中,我_CompositeCollection容器結合一個ItemsControl與帆布的ItemsPanelTemplate。

什麼都不添加到畫布。如果我從視圖模型中刪除的ICollectionView的層而直接使用的ObservableCollection在CollectionContainer.Collection正常工作:

var container = new CollectionContainer() { Collection = viewModel.ObservableCollectionA }; 

我不想直接暴露的ObservableCollection,我認爲這是與整個一致MVVM範例。

它看起來像CompositeCollection無法正常工作;我如何將多個ICollectionView合併爲一個集合以綁定到單個ItemsControl?或者也許有更好的結構使用?

我正在使用C#4.0。

回答

0

CollectionViewSource應該是UI的一部分,因爲您需要PresentationFramework.dll才能使用它。
至於結構,我通常有這樣的:
在XAML:

<CollectionViewSource Source="{Binding CmbList}" x:Key="cmbList"></CollectionViewSource> 
<CollectionViewSource Source="{Binding Items}" x:Key="items"></CollectionViewSource><!-- this goes into your Resources tag 

<ComboBox> 
    <ComboBox.ItemsSource><!-- in here we are using multiple types of collections and objects 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Source={StaticResource items}}"></CollectionContainer> 
      <sys:String>Newly added item</sys:String> 
      <CollectionContainer Collection="{Binding Source={StaticResource cmbList}}"></CollectionContainer> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

其中xmlns:sys="clr-namespace:System;assembly=mscorlib"
而我的ViewModel有這樣的集合定義:

private string[] _items; 

public string[] Items 
{ 
    get { return _items; } 
    set { _items = value; OnPropertyChanged("Items"); } 
} 
private List<int> _cmbList; 

public List<int> CmbList 
{ 
    get { return _cmbList; } 
    set { _cmbList = value; OnPropertyChanged("CmbList"); } 
} 

正如你將看到這個意願顯示2種非常不同的收藏類型以及我們創建的附加項目。