将ICollectionViewFactory与CompositeCollections和ItemsControls一起使用

时间:2019-04-09 22:48:49

标签: c# wpf binding

我有一个自定义集合类,可实现IList<T>INotifyCollectionChangedICollectionViewFactory

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上方的代码中引用了自定义集合类。并且SortDescriptionsFilterFilterProperties已正确填写。

我的问题:

如果我将自定义集合类的实例添加到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两种情况下似乎都具有相同的排序问题。
  • 并非在所有情况下都始终出现ComboxBox问题:如果我在一个基本为空的窗口中创建一个,则看起来工作正常。不幸的是,我无法(从一个相当复杂的应用程序中)提取更多的演示代码-而且,因为我不知道哪些部分是相关的。
  • 我还无法(有时间)隔离CompositeCollection问题;这是非常动态的TreeView,仅供参考。

最终:CompositeCollections是否使用ICollectionViewFactory,我应该在哪里寻找ComboBox问题的原因?

0 个答案:

没有答案