c# - 如何制作只读的 ObservableCollection 属性?

标签 c# .net wpf observablecollection

我想在包含对象列表(来自数据库)的 View 模型上公开一个属性。

我需要这个集合是只读的。也就是说,我想阻止添加/删除等。但允许 foreach 和索引器工作。我的意图是声明一个包含可编辑集合的私有(private)字段,并使用只读公共(public)属性引用它。如下

public ObservableCollection<foo> CollectionOfFoo { 
     get { 
         return _CollectionOfFoo;
     }
}

但是,该语法只是防止更改对集合的引用。它不会阻止添加/删除等。

实现此目标的正确方法是什么?

最佳答案

[先前] 接受的答案实际上会在每次访问 ReadOnlyFoo 时返回一个不同的 ReadOnlyObservableCollection。这是一种浪费,并可能导致细微的错误。

一个更好的解决方案是:

public class Source
{
    Source()
    {
        m_collection = new ObservableCollection<int>();
        m_collectionReadOnly = new ReadOnlyObservableCollection<int>(m_collection);
    }
 
    public ReadOnlyObservableCollection<int> Items
    {
        get { return m_collectionReadOnly; }
    }
 
    readonly ObservableCollection<int> m_collection;
    readonly ReadOnlyObservableCollection<int> m_collectionReadOnly;
}

参见 ReadOnlyObservableCollection anti-pattern进行全面讨论。

关于c# - 如何制作只读的 ObservableCollection 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763696/

相关文章:

c# - 旋转附加到其他对象的对象

c# - 三元最佳实践

c# - 全屏应用程序阻止热键

c# - 什么 WPF 控件可以用于 WP7 上的只读项目列表?

c# - 绑定(bind)失败如何指定默认值?

c# - 您可以声明 2 个同名的 OData 资源实体集吗?

c# - SSH.NET - 未找到合适的身份验证方法

.net - 为什么 FileSystemWatcher 在将文件复制到目录时会创建多个更改事件

WPF:在不知道项目的情况下更改 ComboBox 的字体大小

c# - 不为同步请求调用中间件