当树模型的源更新时 WPF 更新 TreeView

WPF update TreeView when source updates for a tree model

我实现了这样一个树模型:

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,因为它们太复杂了。 现在,我知道有两种可能的方法:

  1. 使用依赖属性:我了解它们是如何工作的,但我不知道如何将它们应用到我的模型中。

  2. 使用事件触发器,但我也不知道如何将它们应用于我的问题。

请帮帮我!

只需让您的节点实现 INotifyPropertyChanged and use 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));
    }

}