Я написал пользовательский элемент управления WPF с расширением поиска, назовем его MyControl
. Контроль является потомком класса ItemsControl
.WPF CollectionViewSource Несколько просмотров?
Так что кормить источник данных, чтобы это следующим образом:
Самим управления использует
protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
{
if (newValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
view.Filter += this.FilterPredicate;
}
if (oldValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(oldValue);
view.Filter -= this.FilterPredicate;
}
base.OnItemsSourceChanged(oldValue, newValue);
}
для фильтрации вида коллекции источника (таким образом, отображая его во внутреннем ListBox).
Теперь предположим, что у нас есть 10 из этих MyControls, определенных в XAML с тем же DynamicSource. Проблема заключается в том, что если один из них применит фильтр к исходной коллекции, это затронет и все остальные экземпляры.
Как вы изменили бы элемент управления, чтобы избежать такого поведения?
ОК здорово это действительно работает .. Большое спасибо! Просто вопрос noobie - это .RegisterReadOnly(), что вы подразумеваете под словом «readonly»? –
Я спрашиваю, потому что в ItemsSourceChanged я устанавливаю ItemSourceView = new CollectionViewSource {Source = newValue} .View, где ItemsSourceView является DP, поэтому я не могу просто удалить установщик. –
Да. Это немного больше, чем просто изменение инициализации: private static readonly DependencyPropertyKey MyDPPropertyKey = DependencyProperty.RegisterReadOnly (...); public static readonly DependencyProperty MyDPProperty = MyDPPropertyKey.DependencyProperty; общественный объект MyDP { \t get {return (object) GetValue (MyDPProperty); } \t частный набор {SetValue (MyDPPropertyKey, value); } } –