首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >商业模型包装

商业模型包装
EN

Stack Overflow用户
提问于 2014-02-26 12:16:29
回答 2查看 86关注 0票数 0

以下是2010年的文章:MVVM:要不要包扎?

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

我的观点是,我必须构建一个UI,不能控制模型。该模型更新自身及其不同的ObservableCollection,并具有许多层次结构。类似于:

代码语言:javascript
复制
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来结束。

在开始自己添加这些痛苦的管道之前,我想看看这里的人是如何处理这些问题的。

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-26 15:37:27

最后,我想说明以下几点:

MVVM包装器

票数 0
EN

Stack Overflow用户

发布于 2014-02-26 13:07:48

你可以做很多事情:

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

把它吸进去然后写代码。

我自己也使用LinqPad来编写这样的脚本:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22041102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档