【发布时间】: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 如果你需要我可以在这里分享源代码。