商业模式的包装

时间:2014-02-26 12:16:30

标签: c# wpf mvvm

关注2010年的文章:MVVM: To Wrap or Not to Wrap?

我想知道从那以后它是否存在某种框架或类来帮助我们构建模型对象的包装器,它将完成有关模型中INotifyPropertyChanged模型属性和ObservableCollection的所有管道。

我的观点是我必须构建一个UI并且无法控制模型。模型更新自身及其不同的ObservableCollection并具有多个层次级别。 类似的东西:

class A
      |
      some properties that implement INotify
      ObservableCollection<Class B>

class B
      |
      some properties that implement INotify
      ObservableCollection<Class C>

class C
      |
      etc...

目前,VM使用对模型属性的直接引用,但UI非常简单。 能够添加新UI功能的一种便捷方式是每个模型都有一个VM,这样我就可以在层次结构的每个级别添加一些自定义UI属性,并最终使用VM对象的ObservableCollection。

在开始添加所有这些痛苦的管道之前,这可能会给我带来麻烦和时间,我想检查这里的人们是如何处理这个问题的。

非常感谢。

2 个答案:

答案 0 :(得分:1)

你可以做很多事情:

使用PostSharp对已编译的代码进行后处理,以通过添加必要的代码来更改IL。优点:非常简单。缺点:堆栈跟踪中的行号不再与源代码中的行号匹配。就个人而言,我不会用它。

把它吸干然后写下代码。

我自己,我使用LinqPad这样的脚本:

void Main()
{
    StringBuilder sb = new StringBuilder();
    string source = @"        public bool Passed { get; set; }
        public string Name { get; set; }
        public Type TestType { get; set; }
        public Exception Exception { get; set; }
        public TestStage StageFailed { get; set; }
        public bool IncludeTest { get; set; }";
    string[] lines = source.Replace('\r', ' ').Split('\n');
    for (int i = 0; i < lines.Length; i++)
    {
        string prop = lines[i].Trim();
        string[] propBits = prop.Split(' ');
        string type = propBits[1];
        string name = propBits[2];
        sb.Append("private " + type + " " + PascalCase(name) + ";\r\n");
        sb.Append("public " + type + " " + name + "\r\n");
        sb.Append("{\r\n");
        sb.Append("get { return this." + PascalCase(name) + "; }\r\n");
        sb.Append("set\r\n");
        sb.Append("{\r\n");
        sb.Append("if (this." + PascalCase(name) + " != value)\r\n");
        sb.Append("{\r\n");
        sb.Append("this." + PascalCase(name) + " = value;\r\n");
        sb.Append("RaisePropertyChanged(\"" + name + "\");\r\n");
        sb.Append("}\r\n");
        sb.Append("}\r\n");     
        sb.Append("}\r\n");     
    }
    sb.ToString().Dump();
}

private string PascalCase(string name)
{
    return name.Substring(0, 1).ToLower() + name.Substring(1);
}

我复制代码以将INotify位放入其中:string source = @"并将运行它的输出复制回我的源代码。完成工作。

LinqPad是一个非常非常有用的工具。

答案 1 :(得分:0)

最后我想我会选择以下内容:

MVVM Wrapper