我有一个自定义集合类,可实现IList<T>
,INotifyCollectionChanged
和ICollectionViewFactory
。
ICollectionViewFactory.CreateView
的实现如下所示:
public ICollectionView CreateView()
{
var src = new CollectionViewSource() { Source = InnerList };
if (SortDescriptions.Any())
{
SortDescriptions.ForEach(sd =>
{
src.SortDescriptions.Add(sd);
src.LiveSortingProperties.Add(sd.PropertyName);
});
src.IsLiveSortingRequested = true;
}
bool addFilter = Filter != null && FilterProperties.Any();
if (addFilter)
{
FilterProperties.ForEach(f => src.LiveFilteringProperties.Add(f));
src.IsLiveFilteringRequested = true;
}
var view = src.View;
if (addFilter)
{
view.Filter = i => Filter((T)i);
}
view.CurrentChanging += View_CurrentChanging;
view.CollectionChanged += View_CollectionChanged; ;
return view;
}
在InnerList
上方的代码中引用了自定义集合类。并且SortDescriptions
,Filter
和FilterProperties
已正确填写。
我的问题:
如果我将自定义集合类的实例添加到CompositeCollection
中以用于绑定,例如:
Items = new CompositeCollection { new CollectionContainer() { Collection = myCustomInstance } }
... WPF将使用我的ICollectionViewFactory
接口实现吗?还是我必须使用myCustomInstance.CreateView()
?
此外,当直接将我的收藏集分配给ComboBox.ItemsSource
属性(方案A)时,项目显示顺序错误(显然:最后添加的是列表的第一位),即,我的SortDescriptions
未被考虑
如果我将myCustomInstance.CreateView()
分配给ComboBox
(方案B),则项目将正确排序,但是-在两种情况下-如果我随后添加项目,则始终将其作为第一个添加。 ComboxBox
。如果我创建控件的另一个实例,则分别对项目进行排序:在方案B中是正确的,在方案A中是错误的。
进一步:
CompositeCollection
中使用ComboBox
。CompositeCollection
在A和B两种情况下似乎都具有相同的排序问题。CompositeCollection
问题;这是非常动态的TreeView
,仅供参考。最终:CompositeCollections
是否使用ICollectionViewFactory
,我应该在哪里寻找ComboBox
问题的原因?