CompositeCollection中的ICollectionView

时间:2017-09-21 13:48:00

标签: c# wpf c#-4.0

我使用在我的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。

1 个答案:

答案 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种非常不同类型的集合以及我们创建的其他项目。