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

时间:2015-01-29 13:53:09

标签: c# wpf treeview

我实现了这样的树模型:

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. 使用事件触发器,但我也不知道如何将它们应用于我的问题。

  3. 请帮助我!

1 个答案:

答案 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));
    }

}