ItemsSource + Converter + Treeview не будет обновляться - PullRequest
3 голосов
/ 01 апреля 2009

Этот довольно сложный, надеюсь, я смогу сделать это достаточно понятным, чтобы кто-нибудь помог мне. У меня есть объект, назовем его Менеджером, Менеджер имеет коллекцию людей, которыми он управляет, все люди реализуют IPerson, но разные типы людей имеют разные свойства. Я хочу отобразить этого менеджера в дереве, а под узлом менеджера я хочу показать все проекты, которыми он управляет, что можно определить по людям, которыми он управляет.

Таким образом, планируется использовать конвертер для преобразования человека в Список проектов. Вот XAML:

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
   <TextBlock Text="{Binding Path=Name}"/>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
                    <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding Path="People">
            <Binding.Converter>
                <configUtil:ProjectListConverter/>
            </Binding.Converter>
        </Binding>
    </HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>

Класс My Person реализует INotifyPropertyChanged, а список, содержащий людей, реализует INotifyCollectionChanged. Этот код прекрасно работает, когда я устанавливаю TreeView ItemsSource, менеджеры отображаются со списком проектов.

Однако, когда я добавляю нового человека в список людей, TreeView не обновляется. Когда я отлаживаю, я вижу, что CollectionChanged запускается с действием Add и добавленным элементом. Также событие CollectionChanged не является нулевым, поэтому я знаю, что пользовательский интерфейс смотрит его. Но конвертер не запускается при добавлении элемента.

вот метод Add для List, содержащего объекты IPerson:

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

Я как-то нарушаю привязку данных?

Какие еще вещи я могу проверить?

Конвертер просто просматривает каждый элемент в списке людей и выясняет, над какими проектами он работает, и добавляет имя проекта в выходной список.

1 Ответ

2 голосов
/ 01 апреля 2009

Конвертер применяется к свойству, в котором хранится коллекция. Следовательно, он будет вызываться только в случае изменения самого экземпляра коллекции (а не в случае изменения элементов в коллекции). Одним из способов решения этой проблемы является аннулирование коллекции, когда вы хотите обновить ее.

Самый простой способ сделать недействительным свойство коллекции и снова запустить код преобразователя - это null вывести коллекцию и переназначить ее. Другой способ - получить BindingExpression (через BindingOperations) и позвонить UpdateTarget. Наконец, вы можете вместо этого связать с CollectionView (или его подклассом) и вызвать Refresh на нем.

И если вы действительно хотите решить проблему чисто, вы можете привязаться к собственной реализации ICollectionView, которая выполняет фильтрацию и вызывает события при необходимости.

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