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