我有一个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>
向列表中添加项目一直有效,直到第一次呈现树。渲染后,添加/删除项目不会刷新树。
答案 0 :(得分:4)
如果你将同一个对象分配给datacontext,我猜它不会将datacontext激发为更改。
你有一些选择:
将null分配给datacontext并重新分配列表,或调用任何其他“刷新命令”来刷新您的datacontext,这实际上是一个非常糟糕的主意,因为您的整个树都必须重新生成。
使用ObservableCollection作为列表。如果添加一个项目,WPF会使用该项目仅更新列表的ChangedParts,这会自动触发CollectionChanged事件。
我肯定会建议使用第二种方法!
答案 1 :(得分:1)
我需要实现INotifyPropertyChanged,然后在RootItem更改时触发PropertyChanged。我的代码创建了一个新的项目列表,然后将完整的列表分配给RootItem。如果没有PropertyChanged,TreeView永远不会知道RootItem已经改变了。