我有一个实体框架模型和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分支,这样做的最佳方法是什么?
答案 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")