Это довольно сложно, надеюсь, я смогу объяснить это достаточно ясно, чтобы кто-нибудь помог мне. У меня есть объект, назовем его менеджером, у менеджера есть набор людей, которыми он управляет, все люди реализуют 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>
Мой класс Person реализует INotifyPropertyChanged, а список, содержащий людей, реализует INotifyCollectionChanged. Этот код отлично работает, когда я устанавливаю ItemsSource в виде дерева, менеджеры отображаются со своим списком проектов.
Однако, когда я добавляю нового человека в список людей, TreeView не обновляется. Когда я отлаживаю, я вижу, что CollectionChanged срабатывает с действием «Добавить» и добавленным элементом. Также событие CollectionChanged не является нулевым, поэтому я знаю, что пользовательский интерфейс наблюдает за ним. Но преобразователь не выполняется при добавлении элемента.
вот метод Add для списка, содержащего объекты IPerson:
public void Add(T item)
{
list.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
Я как-то нарушаю привязку данных?
Что еще я могу проверить?
Конвертер просто просматривает каждый элемент в списке людей и выясняет, над какими проектами они работают, и добавляет имя проекта в выходной список.