wpf datagrid-从ObservaleCollection中删除项时datagrid未刷新

wpf datagrid-从ObservaleCollection中删除项时datagrid未刷新,wpf,wpf-4.0,Wpf,Wpf 4.0,我有一个可观测集合,定义如下 private ObservableCollection<RelayConfig> _relayConfigs; public ObservableCollection<RelayConfig> RelayConfigs { get {return _relayConfigs;} set { _relayConfigs = value; } } RemoveWhere是ObservableCollection的扩展方法,

我有一个可观测集合,定义如下

private ObservableCollection<RelayConfig> _relayConfigs;
public ObservableCollection<RelayConfig> RelayConfigs { 
    get {return  _relayConfigs;}
    set { _relayConfigs = value; }
}
RemoveWhere是ObservableCollection的扩展方法,定义如下

public static void RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate) {
    var i = collection.Count;
    while (i-- > 0) {
        var element = collection.ElementAt(i);
        if (predicate(element)) {
            collection.Remove(element);
        }
    }
}
公共静态void removehere(此ICollection集合,Func谓词){
var i=collection.Count;
而(i-->0){
var element=collection.ElementAt(i);
if(谓词(元素)){
收集。移除(元素);
}
}
}

问题是,当我使用上述设置从ObservaleCollection中删除一些行时,我没有看到DataGrid被刷新。这些行仍然在数据网格中徘徊,而实际上它在ObservableCollection中不存在。任何关于为什么Datagrid不能刷新的想法。

我遇到过完全相同的事情,即使对行值进行了更改。我找到的解决方案非常简单,否则

YourDataGrid.Items.Refresh()


它告诉您的datagrid返回到其显示的项目所在的任何源,并用最新的值刷新它们。这样,就不会丢失任何“绑定”,正如您所期望的那样,只是刷新。

实际上,我使用的是MVVM(Caliburn Micro),并且我的ViewModel中没有DataGrid的引用。因此,您的解决方案在我的情况下无法实现。只需在另一个ItemsControl上检查这一点,以确保这是(或不是)DataGrid造成的。顺便说一句,我不喜欢对集合使用setter,使字段为只读。以后很容易更改引用,但是旧绑定将没有实际引用。我认为Datagrid没有问题。我有代码,非常类似于我在这里发布的代码,用于另一个运行良好的实体。它只是在这种情况下不起作用而已。顺便说一句,我会按照你的建议把藏品设为只读。听起来合乎逻辑。WPF中的可观察集合只有一个问题。如果您想完全用新项目重新填充,则必须逐个删除和添加项目,从而在每次操作中进行更新。这就是为什么许多人喜欢更改集合本身,并在setter中引发PropertyChanged事件。为了克服这个缺点,我只编写了自己的集合列表,其中包含通知:INotifyCollectionChanged如果需要,我可以在这里共享源代码。
RelayConfigs.RemoveWhere(r => r.IsMarked);
public static void RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate) {
    var i = collection.Count;
    while (i-- > 0) {
        var element = collection.ElementAt(i);
        if (predicate(element)) {
            collection.Remove(element);
        }
    }
}