过滤器的item属性更改时,Datagrid未更新

时间:2010-06-22 13:49:59

标签: wpf datagrid filter observablecollection inotifypropertychanged

我有一个带有datagrid和按钮的简单表单。数据网格中的项目绑定到ObservableCollection的{​​{1}}。 customers实现customer接口。每个客户都有INotifyPropertyChanged属性(类型为bool)。我为客户默认视图设置了一个过滤器,以根据deleted属性过滤掉已删除的客户。到目前为止它的确有效。

然后我为按钮添加一个事件,将所选客户标记为已删除。问题是在设置deleted后网格未更新。删除的客户仍然可见。绑定到selected_customer.deleted = true属性的列正确更新。要从网格中删除客户,我必须手动调用客户默认视图的deleted方法。

为什么当我使用Refresh()并且客户实现ObservableCollection接口时,datagrid不会自动更新?如何让它自动更新?

1 个答案:

答案 0 :(得分:0)

我假设您使用CollectionViewSource进行过滤。 下面的代码将订阅对客户的已删除属性的更改,并在已删除更改时刷新collectioviewsource。客户是Customer类的ObservableCollection。 Customer有一个名为Deleted的bool属性,并实现了INotifyPropertyChanged。应在填充Customers之前调用InitAutoRefresh()。

private void InitAutoRefresh(ObservableCollection<Customer> observableCollection, CollectionViewSource collectionViewSource)
{
    observableCollection.CollectionChanged += 
        (sender, e) =>
        {
            foreach(Customer newItem in e.NewItems)
            {
                newItem.PropertyChanged += 
                    (sender2, e2) =>
                    {
                        if (e2.PropertyName == "Deleted")
                        {
                            collectionViewSource.View.Refresh();
                        }
                    };
            }
        };
}

在填充可观察集合之前调用它。如果您在XAML中声明了collectionViewSource,则可以使用FindResource来获取实例。

InitAutoRefresh(Customers, FindResource("cvsCustomers") as CollectionViewSource);