【问题标题】:wpf datagrid - Datagrid not getting refreshed when items are removed from ObservableCollectionwpf datagrid - 从 ObservableCollection 中删除项目时数据网格不会刷新
【发布时间】:2012-11-19 02:13:46
【问题描述】:

我有一个 ObservableCollection 定义如下

private ObservableCollection<RelayConfig> _relayConfigs;
public ObservableCollection<RelayConfig> RelayConfigs { 
    get {return  _relayConfigs;}
    set { _relayConfigs = value; }
}

这使用 ItemsSource 属性绑定到 wpf Datagrid 并如下所示填充

RelayConfigs = new ObservableCollection<RelayConfig>(unitOfWork.RelayConfigRepository.GetQueryable().Include(rc => rc.StandardContacts));

我正在从 ObservableCollection 中删除符合此类特定条件的项目。

RelayConfigs.RemoveWhere(r => r.IsMarked);

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);
        }
    }
}

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

【问题讨论】:

  • 只需在另一个 ItemsControl 上检查它,以确保它是(或不是)DataGrid 的责任。顺便说一句,我不喜欢将 setter 用于使字段只读的集合。稍后更改引用很容易,但旧的绑定将留下不实际的引用。
  • 我认为 Datagrid 没有问题。我有另一个工作正常的实体的代码,与我在此处发布的内容非常相似。它只是在这种情况下不起作用。顺便说一句,我会按照您的建议将 Collections 设为只读。听起来合乎逻辑。
  • WPF 中的 observable 集合只有一个问题。如果您想用新项目完全重新填充它,则必须逐个删除和添加项目,从而导致每个操作的更新。这就是为什么许多人更喜欢更改集合并在 setter 中引发 PropertyChanged 事件。为了克服这个缺点,我刚刚编写了我自己的集合 ListWithNotifications :INotifyCollectionChanged 如果你需要我可以在这里分享源代码。

标签: wpf wpf-4.0


【解决方案1】:

即使对行值应用更改,我也遇到过同样的情况。我找到的解决方案很简单,否则......

YourDataGrid.Items.Refresh();

它告诉您的数据网格返回到显示项目的任何来源,并使用最新值刷新它们。这样,不会丢失任何“绑定”,只会丢失您所期望的刷新。

【讨论】:

  • 实际上,我使用的是 MVVM (Caliburn Micro),我的 ViewModel 中没有 DataGrid 的引用。所以在我的情况下你的解决方案无法实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多