2010-05-31 64 views
0

我有一个列表,我绑定到一个TreeView。设置TreeView.DataContext的工作原理 - 一切正常显示。然后我改变列表(向它添加一个项目)并再次设置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> 

添加项目到列表中工作,直到树呈现的第一次。渲染后,添加/删除项目不刷新树。

+0

什么是你的代码中的“this”?那么XAML方面是怎样的呢?你是否将你的hierarchicaldatatemplate设置为正确的? – 2010-05-31 23:48:18

+0

也许RootItem必须是DependencyProperty? – 2010-06-02 23:06:13

+0

因此,在您的UpdateTree方法中,如果在末尾添加: RootItem.Items.Add(new xItem {Text =“new Subitem”}); 它不会显示? – 2010-06-11 10:36:01

回答

4

如果您将相同的对象分配给datacontext,我想它不会触发datacontext被更改。

你有一些选择这里:

  1. null分配到DataContext并重新分配你的列表,或拨打任何其他“令人耳目一新的命令”,得到您的DataContext刷新,这实际上是一个非常糟糕的主意,因为你的整棵树必须重新生长。

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

我肯定会推荐使用第二种方法!

+0

第一种方法有效。第二个不是。 第二,它仍然不刷新树。我已将我的代码添加到问题中。 – 2010-05-31 21:57:53

1

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

+0

与你所说的代码建立你不需要你的rootitem属性changed。但不是创建一个新列表并将其分配给items属性,清除它然后执行AddRange – 2010-06-14 23:25:58