Чтобы переместить вышеупомянутое в структуру, которая обеспечивает надлежащую привязку данных, вам нужно добавить следующее свойство в ваш класс DataContext:
public ObservableCollection<TreeViewItemContext> Collection { get => this._Collection; set { this._Collection = value; this.RaisePropertyChanged(); } }
private ObservableCollection<TreeViewItemContext> _Collection;
Класс TreeViewItemContext
должен выглядеть следующим образом:разрешить итерацию по всем элементам:
public class TreeViewItemContext
{
public ObservableCollection<TreeViewItemContext> Children { get; }
public MyObject Wrapped { get; }
/* Other properties etc. go in here. */
public TreeViewItemContext(MyObject wrapped)
{
this.Children = new ObservableCollection<TreeViewItemContext>();
this.Wrapped = wrapped;
}
public IEnumerable<TreeViewItemContext> IterateTree()
{
yield return this;
foreach (var tvic in this.Children)
{
foreach (var it in tvic.IterateTree())
{
yield return it;
}
}
}
}
, в то время как ваш код XAML будет таким простым:
<TreeView ItemsSource="{Binding Collection}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}>
<Setter Property="Header" Value="{Binding Wrapped.Name}"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchialDataTemplate ItemsSource="{Binding Children}">
<!-- Your DataTemplate-Content Goes In Here -->
</HierarchialDataTemplate>
</TreeView.Resources>
</TreeView>
Чтобы затем выполнить итерацию по всем элементам в TreeView, вам просто нужно сделатьCollection.SelectMany((it) => it.IterateTree())
в вашем основном объекте DataContext и покончим с ним.
Выполнение этого также позволит вам «просто» обновить коллекцию, добавляя / удаляя элементы из нее или просто создавая новуюодин.
метод RaisePropertyChanged
кстати.всегда так:
public class AnyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName]string callee = "") => this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(callee));
//...
}
Все ваши проблемы с обновлением исчезнут.