C# 商业模式的包装

C# 商业模式的包装,c#,wpf,mvvm,C#,Wpf,Mvvm,在这篇文章之后: 我想知道,从那时起,它是否存在某种框架或类来帮助我们围绕模型对象构建包装器,该包装器将完成有关INotifyPropertyChanged模型属性和模型中ObservableCollection的所有管道工作 我的观点是,我必须构建一个UI,而不能控制模型。模型更新自身及其不同的可观测集合,并具有多个层次。 比如: class A | some properties that implement INotify ObservableColle

在这篇文章之后:

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

我的观点是,我必须构建一个UI,而不能控制模型。模型更新自身及其不同的可观测集合,并具有多个层次。 比如:

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

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

class C
      |
      etc...
A类
|
实现INotify的一些属性
可观测收集
B类
|
实现INotify的一些属性
可观测收集
C类
|
等
目前,VM使用直接引用模型属性,但UI非常简单。 能够添加新UI功能的一个方便方法是每个模型有一个VM,这样我就可以在层次结构的每个级别添加一些自定义UI属性,并最终获得VM对象的ObservableCollection

在我自己开始添加这些可能给我带来麻烦和时间的痛苦管道之前,我想看看这里的人们是如何处理这些问题的


非常感谢。

您可以做很多事情:

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

吸取教训,写出代码

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

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);
}
void Main()
{
StringBuilder sb=新的StringBuilder();
字符串源=@“公共布尔传递{get;set;}”
公共字符串名称{get;set;}
公共类型TestType{get;set;}
公共异常{get;set;}
公共TestStage阶段文件{get;set;}
公共bool包括测试{get;set;}”;
string[]line=source.Replace('\r','').Split('\n');
对于(int i=0;i
我复制代码以将INotify位放入其中:
stringsource=@“
,然后将运行它的输出复制回我的源代码中。工作完成


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

最后,我想我将使用以下工具:


有,但您不能使用它,因为它依赖于您无法访问的内部结构。它是WF4中的ModelItem。它在设计器中用于包装POCO,并提供对属性更改通知、集合更改事件、撤消/重做、附加属性等的支持。如果您研究它的工作原理,您可以创建自己的实现继续。我会看一看。谢谢。现在…如果你没有加入所有的换行符,行号仍然会匹配…它们仍然会匹配,就像我在编译之前在源代码中所做的那样。是PostSharp交织的IL改变了行号。这不是使用PostSharp。谢谢你。看看PostSharp,看到了吗ms非常有用,但我在论坛上发现这个帖子说它不支持可观察的收集:正如我所说,我自己不使用它。真的,试试LinqPad吧,它是免费的。