为什么在收集过滤后WPF数据绑定不会更新?

时间:2009-08-28 09:05:43

标签: .net wpf data-binding filter collectionviewsource

为什么我的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时,不会调用它。

2 个答案:

答案 0 :(得分:0)

当从集合中添加或删除项目时,可观察集合会发送属性更改通知事件,当项目内容发生更改时,它不会发送更新。尝试自己发送通知,看看你的WPF视图是否更新。

答案 1 :(得分:0)

使用DynamicResource而不是使用StaticResource可以帮助您。如下所示

ItemsSource="{Binding Source={DynamicResource ListBoxViewSource}}"