我使用在我的ViewModel中定义的CompositeCollection将形状(各种类型)渲染到Canvas。我已经从我的基础数据中创建了几个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为Canvas。
Canvas中没有添加任何内容。如果我从ViewModel中删除ICollectionView层并直接在CollectionContainer.Collection中使用ObservableCollection它可以正常工作:
var container = new CollectionContainer() { Collection = viewModel.ObservableCollectionA };
我不想直接公开ObservableCollection,我认为这与整个MVVM范例一致。
似乎CompositeCollection无法正常工作;如何将多个ICollectionViews合并到一个集合中以绑定到单个ItemsControl?或者可能有更好的结构使用?
我正在使用C#4.0。
答案 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种非常不同类型的集合以及我们创建的其他项目。