我实现了这样的树模型:
public class Node
{
public NodeValue Item { get; set; }
public Node Parent { get; set; }
public List<Node> Children { get; set; }
}
我在WPF TreeView中显示了这些节点。
<TreeView Name="MainTreeview" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="200" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" SelectedItemChanged="MainTreeview_SelectedItemChanged" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local2:Node}" ItemsSource="{Binding Path=Children, Mode=OneWay}">
<TreeViewItem Header="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
我的问题是我更新模型后无法更新视图。我从其他文章中不了解如何更新UI,因为它们太复杂了。 现在,我知道这有两种可能的方式:
使用依赖属性:我理解它们是如何工作的,但我不知道如何将它们应用到我的模型中。
使用事件触发器,但我也不知道如何将它们应用于我的问题。
请帮助我!
答案 0 :(得分:1)
只需让您的节点实施INotifyPropertyChanged并使用ObservableCollections代替不可观察的列表。
部分实施让您顺利前进......
public class Node : INotifyPropertyChanged
{
private Node _parent;
public Node Parent
{
get
{
return this._parent;
}
set
{
if (value != this._parent)
{
this._parent= value;
NotifyPropertyChanged();
}
}
}
public ObservableCollection<Node> Children { get; } = new ObservableCollection<Node>()
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?(this, new PropertyChangedEventArgs(propertyName));
}
}