为什么我的WPF ContextMenu数据绑定在更新集合时没有按预期更新,但是ItemTemplate正在正确显示上下文菜单文本?
在下面的代码中,当我不尝试更新ObservableCollection时,这是有效的。更新基础ObservableCollection时,DataTemplate会更新而不会出现问题,并按预期显示新的MenuItem文本。但是,在刷新发生后,MenuItem.Tag返回Nothing?
数据绑定MenuItem.Tag在首次加载集合时起作用,但在更新后不起作用。关于如何找到此错误的任何想法?部分XAML代码如下所示:
<ListBox ItemsSource="{Binding Source={StaticResource ListBoxViewSource}}">
<ListBox.ItemTemplate>
<DataTemplate>
<WrapPanel>
<WrapPanel.ContextMenu>
<ContextMenu>
<Separator/>
<MenuItem ItemsSource="{Binding Source={StaticResource ContextViewSource}}" ItemTemplate="{StaticResource DataTemplate}">
<MenuItem.Tag>
<Binding Path="ID" Source="{StaticResource ContextViewSource}"/>
</MenuItem.Tag>
更新#1:问题似乎与CollectionViewSource有关,而Filter在发生过滤后未更新MenuItem.Tag绑定并删除了该项。我添加了CollectionViewSource.View.Refresh(),其中集合将会改变,但这仍然无法解决问题。
更新#2 我已经实施了INotifyPropertyChanged,这对过滤问题没有帮助。如果我删除CollectionViewSource上的Filter,则不会发生此问题。我还在MenuItem.Tag绑定中添加了一个转换器,在应用过滤并且然后将MenuItem.Tag设置为Nothing时,不会调用它。
答案 0 :(得分:0)
当从集合中添加或删除项目时,可观察集合会发送属性更改通知事件,当项目内容发生更改时,它不会发送更新。尝试自己发送通知,看看你的WPF视图是否更新。
答案 1 :(得分:0)
使用DynamicResource而不是使用StaticResource可以帮助您。如下所示
ItemsSource="{Binding Source={DynamicResource ListBoxViewSource}}"