Этот довольно сложный, надеюсь, я смогу сделать это достаточно понятным, чтобы кто-нибудь помог мне. У меня есть объект, назовем его Менеджером, Менеджер имеет коллекцию людей, которыми он управляет, все люди реализуют 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));
}
Я как-то нарушаю привязку данных?
Какие еще вещи я могу проверить?
Конвертер просто просматривает каждый элемент в списке людей и выясняет, над какими проектами он работает, и добавляет имя проекта в выходной список.