c# - FxCop 讨厌我对 MVVM 的使用

标签 c# data-binding mvvm fxcop observablecollection

我刚刚开始使用 FxCop 来查看我的代码在违反其整套规则方面的表现有多糟糕。我从“违反”规则开始,我遇到的第一个规则是 CA2227,它基本上说您应该将集合属性的 setter 设置为只读,这样您就不会意外更改集合数据。

自从我使用 MVVM 以来,我发现使用具有获取/设置属性的 ObservableCollection 非常方便,因为它使我的 GUI 更新在代码隐藏中变得简单和简洁。不过,我也能看出 FxCop 在提示什么。

我刚刚遇到的另一种情况是使用 WF,我需要在创建工作流时设置参数,而且我不想不得不围绕我正在使用的集合编写一个包装类来避免这种特殊情况错误信息。

例如,这是我将属性设置为只读时收到的示例运行时错误消息:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff'

您对此有何看法?我可以忽略这个特定错误,但这可能不太好,因为我可以想象在 MVVM 不适用的代码中的其他地方违反此规则(例如,仅模型代码)。我认为我也可以将它从一个属性更改为一个类,该类具有操作底层集合的方法,然后从 setter 方法发出必要的通知。我有点困惑...任何人都可以对此有所了解吗?

最佳答案

此特定规则说明集合属性应设为只读,因为您不需要将整个集合分配给属性。

例如,想象一个这样的类:

public class Foo
{
   public ObservableCollection<int> Bar { get; set; }
}

如果我在代码中的某处有以下行会发生什么:

var f = new Foo();
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 1, 2, 3, 4 });
// ...
// Attaches and handlers to the collection events
// ...
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 5, 6, 7, 8 });

当执行最后两行代码时,不会触发附加的事件处理程序,因为 Bar 属性有一个完全不同的对象。

另一方面,如果该属性是只读的,则会触发事件并且一切都会按预期运行。

关于c# - FxCop 讨厌我对 MVVM 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539554/

相关文章:

c# - LINQ to SQL 求和空值

c# - 将 CheckBoxList 绑定(bind)到通用列表

wpf - 有没有人有在 MVVM 模式下工作的 WPF Datagrid 的代码示例?

asp.net-mvc-3 - 我是否在 MVC ASP.NET 中不必要地复制模型?

c# - 如何在 MahApps.Metro 中添加 AnimatedTabControl?

c# - 如何读取包含 Datetime 类型的 BaseHttpActionResult 的响应

c# - ItemsControl 显示几层数据

ios - 如何将我的 UIButton 标题绑定(bind)到我的 ViewModel

c# - 基础构造函数的使用

jquery - 如何将 jquery 插件应用于由 knockout 模板生成的 div