集合属性应该是只读的。

3

我正在使用FxCop来检查我的WPF MVVM程序集,它报告了如下错误:

集合属性应该是只读的

但是,在我的属性中,我需要调用RaisePropertyChangedEvent方法。如果我通过移除set部分将属性设置为只读的话,那么我如何能够触发这个事件呢?

代码大致如下:

public List Employees
{
    get { return _employees; }
    set
    {
        if (ReferenceEquals(_employees, value))
            return;
        _employees = value;
        RaisePropertyChanged("Employees");
    }
}
2个回答

3
你很少需要在集合中引发PropertyChanged事件。将集合设置为可观察的,这样它就可以在添加或删除项时通知任何绑定:
public IList<Employee> Employees
{
    get; 
    private set;
}

// in your constructor:
this.Employees = new ObservableCollection<Employee>();

2
永远不要说“永远不”…… 当然有一些情况是合理的,这时集合属性就不需要只读!例如,如果你正在一个工作线程中加载大量数据,你想把这些数据加载到一个单独的集合中,然后完全替换现有的集合。如果你试图在原地进行更改,这是不可能的,因为你会不断需要在主调度程序上调用更改。 - cordialgerm
好的,为了避免被踩,我会改一下措辞。我们可以说需要一个可设置的集合是一个边缘情况。FxCop是正确的。 - Matt Hamilton
属性上用了 readonly 关键字?注意到私有的 setter 了吗? - Matt Hamilton
我承认在构造函数之后写入此属性在技术上是可能的,但这是你的类 - 不像它容易被滥用。 - Matt Hamilton
@H.B 耸肩 ... 我有很多应用程序都是这样做的。我理解你的观点,但相比上面简洁的代码片段,设置只读字段和相关属性需要很多仪式感。我想每个人都有自己的喜好吧。 - Matt Hamilton
显示剩余2条评论

2

如果你将你的集合设置为ObservableCollection,那么"重要"的事件将是当项目被添加和从集合中删除时,而不是在集合实例化时。我同意FxCop的观点。将集合设置为只读,但使它成为ObservableCollection。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接