Как наблюдать за конвертированными коллекциями? - PullRequest
1 голос
/ 09 сентября 2010

Я связываю коллекцию ObservableCollection<Foo> со свойством зависимостей на моем контроллере, но я запускаю его через IValueConverter, чтобы вместо этого сделать его ObservableCollection<object>, чего и ожидает мой контроллер.Преобразование работает отлично - я создаю ObservableCollection<object> и заполняю его всеми Foo из исходного списка.Это, однако, приводит к проблеме, заключающейся в том, что теперь я наблюдаю за коллекцией, созданной в конвертере значений, и, следовательно, не вижу никаких изменений в исходной коллекции.

Итак;Нужно ли подключать обработчики событий в конвертере, чтобы вручную синхронизировать преобразованную коллекцию с исходной, или есть лучший способ справиться с этим?Я полагаю, я не могу сделать преобразование без создания новой коллекции?Или я могу сделать связывание каким-то умным способом, чтобы мне не пришлось делать преобразование?

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Я не знаю, помогает ли это, но часто в ViewModel я объявляю IList или другой менее специфичный интерфейс в качестве типа свойства вместо определенного.

Тогда я могу связать квази все коллекции и списки с этим свойством.

Пока свойство установлено, я проверяю, реализует ли оно INotifyPropertyChanged и, если да, я присоединяю CollectionChanged-EventHandler.Когда свойство изменилось заново, я удаляю EventHandler из старого INotifyPropertyChanged (если он был).

Недостатком этого является то, что ViewModel должен быть подготовлен для просмотра объектов других типов, чем ожидалось.Но обычно это простая работа.

void YourDPValueChanged(DependencyPropertyChangedEventArgs e) {
    INotifyCollectionChanged newCollection = e.NewValue as INotifyCollectionChanged;
    INotifyCollectionChanged oldCollection = e.OldValue as INotifyCollectionChanged;
    if (null != newCollection) {
        newCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }
    if (null != oldCollection) {
        oldCollection.CollectionChanged -= new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }
0 голосов
/ 09 сентября 2010

Если я правильно понимаю, вы связываете какую-то ICollection, которая не реализует INotifyCollectionChanged через конвертер, который создает новую ObservableCollection.В этом случае вы не получите никакой выгоды от отключенной коллекции.Можно ли связать вашу коллекцию напрямую (без конвертации) и реализовать INotifyPropertyChanged и / или INotifyCollectionChanged непосредственно на вашем объекте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...