设置TreeView.DataContext不会刷新树

时间:2010-05-31 07:53:58

标签: wpf

我有一个List,我已经绑定到TreeView。设置TreeView.DataContext工作 - 一切正确显示。然后我更改列表(向其添加项目)并再次设置TreeView.DataContext(到相同的值),但树不会刷新新项目。如何刷新树视图?

这基本上是我的代码:

public class xItemCollection : ObservableCollection<xItem>
{
}

public class xItem : INotifyPropertyChanged
{
    xItemCollection _Items;
    string m_Text;

    public xItem()
    {
        _Items = new xItemCollection();
    }

    public xItemCollection Items {get{return _Items;}}
    public string Text {get{return m_Text;} set{m_Text=value;}}
}

class MyProgram
{
    xItem m_RootItem;

    void UpdateTree()
    {
        this.RootItem = new xItem();
        treeView.DataContext = this;
    }

    public xItem RootItem
    {
        get { return m_RootItem;}
        set { m_RootItem = value;}
    }
}

xaml是:

<TreeView Name="Tree" ItemsSource="{Binding Path=RootItem.Items}" >

<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Items}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

向列表中添加项目一直有效,直到第一次呈现树。渲染后,添加/删除项目不会刷新树。

2 个答案:

答案 0 :(得分:4)

如果你将同一个对象分配给datacontext,我猜它不会将datacontext激发为更改。

你有一些选择:

  1. 将null分配给datacontext并重新分配列表,或调用任何其他“刷新命令”来刷新您的datacontext,这实际上是一个非常糟糕的主意,因为您的整个树都必须重新生成。

  2. 使用ObservableCollection作为列表。如果添加一个项目,WPF会使用该项目仅更新列表的ChangedParts,这会自动触发CollectionChanged事件。

  3. 我肯定会建议使用第二种方法!

答案 1 :(得分:1)

我需要实现INotifyPropertyChanged,然后在RootItem更改时触发PropertyChanged。我的代码创建了一个新的项目列表,然后将完整的列表分配给RootItem。如果没有PropertyChanged,TreeView永远不会知道RootItem已经改变了。