У меня есть собственный класс коллекции, который реализует 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. - Проблема ComboxBox возникает не во всех случаях последовательно: если я создаю ее в практически пустом окне, она работает нормально.К сожалению, я не могу извлечь больше демонстрационного кода (из довольно сложного приложения) - также, потому что я не знаю, какие части актуальны.
- Я также не смог (успел) выделить
CompositeCollection
выпуск;это очень динамично TreeView
, к вашему сведению.
В конечном счете: CompositeCollections
использует ICollectionViewFactory
и где мне искать причину проблем ComboBox
?