EF模型ItemsSource更新后的部分TreeView刷新

时间:2014-01-23 12:46:09

标签: c# wpf treeview refresh

我有一个实体框架模型和TreeView,它与模型绑定。

在构造函数中:

 Context.TestCategory.Load();

我的TreeView:

<TreeView x:Name="DbTree" ItemsSource="{Binding Context.TestCategory.Local}">
    <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Tests}" >
                <TextBlock Text="{Binding Name}" ContextMenuOpening="ContextMenu_ContextMenuOpening">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Добавить тест" Click="TestAdd" CommandParameter="{Binding 
                                     RelativeSource={RelativeSource 
                                     AncestorType={x:Type ContextMenu}}}"></MenuItem>
                            </ContextMenu>
                        </TextBlock.ContextMenu> 
                 </TextBlock>
........................................
other items
........................................
            </HierarchicalDataTemplate>
       </TreeView.ItemTemplate>
</TreeView>

更新ItemsSource中的项目后,我需要更新相关的TreeView分支,这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我不确定将ItemsSource直接绑定到上下文属性是一件好事。

您应该对绑定执行的操作是绑定到可以在RaisePropertyChanged更改时执行的属性,然后UI元素将根据需要进行更新。我使用MVVM所以我的绑定全部来自ViewModel,ViewModel是View的datacontext,它实现了INotifyPropertyChanged接口。然后在我的属性设置器中可以看起来像这样:

    private List<TestCategories>_myItemSourceList;
    public List<TestCategories> MyItemSourceList
    {
        get { return _myItemSourceList; }
        set
        {
            if (value != _myItemSourceList)
            {
                _myItemSourceList= value;
                RaisePropertyChanged(() => MyItemSourceList);
            }
        }
    }

XAML看起来像......

<TreeView x:Name="DbTree" ItemsSource="{Binding MyItemSourceList}">

显然,因为你没有使用MVVM,你的代码会略有不同,但原则仍然是:将你的ItemSource绑定到可以RaisePropertyChanged的属性。

编辑:我的RaisePropertyChanged在Prism框架内,所以使用lambda,但'standard'是带有这样的字符串RaisePropertyChanged("MyItemSourceList")