У меня есть трехслойное дерево,
-MAIN
->:SUB1
>:SUB2
>:SUB2
-X:SUB1
X:SUB2
SUB1
SUB1
где,> и X представляют графику, обозначающую состояние этого конкретного элемента (определяется из серверной части).
Я использую Observable Dictionary для привязки к этому дереву (и у него есть событие ICollectionChanged). Структура такая:
ObservableDictionary<string,CustomClass> mainitems;
public class CustomClass{
ObservableDictionary<string, InnerClass> sub1item;
// Bunch of properties and methods in this class
// INotify not implemented
}
public class InnerClass{
// Bunch of properties and methods in this class
// INotify not implemented
public SomeEnum Status{
get{ return this.status; }
}
}
Графики, упомянутые выше, связываются с помощью пользовательского конвертера, который преобразует перечисление Status в путь, чтобы его можно было связать (т. Е. ).
ВОПРОС:
Моя проблема в том, что когда я обновляю словарь подэлементов CustomClass новыми статусами, он не обновляет его в пользовательском интерфейсе. Я думаю, что реализация INotify может работать, но я не знаю, где мне нужно его обновить и как именно это сделать.
Edit:
Мой шаблон XAML для дерева выглядит следующим образом:
<TreeView Name="tvInstance" ItemsSource="{Binding}" TreeViewItem.Selected="tviSelected" IsTextSearchEnabled="True">
<TreeView.ItemContainerStyle>
<Style>
<Setter Property="TreeViewItem.IsExpanded" Value="{Binding Path=Value.Expanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Value.CustomClass}" ItemContainerStyle="{x:Null}">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Path=Key}"/>
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Value.AnotherClass}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=Value.Status, Converter={StaticResource convertstatus} }"
Width="10" Height="10"/>
<Label Content="{Binding Path=Key}" />
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=Value, Converter={StaticResource convertstatus} }"
Width="10" Height="10"/>
<Label Content="{Binding Path=Key}" />
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
РЕДАКТИРОВАТЬ: После добавления всех событий INotifyProperty в мой основной класс, мой CustomClass и мой InnerClass, он по-прежнему не работает. Я использую версию ObservableDictionary от Dr.Web (и использование словаря имеет решающее значение для моего приложения, так как мне нужно сделать много поисков). Помогите!
Эпилог
Ответы на этой странице верны в том смысле, что INotifyPropertyChanged должен быть реализован в свойствах, которые я хочу обновить в пользовательском интерфейсе.
Я обнаружил, что связывание словаря было слишком большой проблемой, поэтому я сохранил и ObservableCollection и Dictionary. Я использовал словарь для поиска и коллекцию для привязки (поскольку обе используют одну и ту же ссылку на объект, удаление было легко с помощью коллекции и единственной операции O (n)).
Что касается обновления в пользовательском интерфейсе, обратитесь к другим публикациям на этой странице.