我有一个问题有关。设计C#/WPF.我已经看看几个演示应用程序,但他们并没有真正处理我的问题。我应用程序包括对象包含其他物体。就像在父母-子女的关系。

我现在的问题是:

  • 没有孩子的属性必须是一个模型
  • 如果是,如何创建新的父的对象,其中包含的 现有的 儿童的对象,通过这个例子?

我sth喜欢的以下情况:

class Child {
    string Name;
}

class ChildVM {
    Child _child;
    string Name{return _child.Name;}
}

class Parent {
    string Name;
    List<Child> children;
}

class ParentVM{
    Parent _parent;

    string Name{return _parent.Name;}
    List<ChildVM> children {get;set;}

    ParentVM(Parent p){_parent = p;}
}

void CreateANewParent(){
    List<ChildVM> children = new List<ChildVM>(){new ChildVM(new Child()),...};
    ParentVM parent = new ParentVM(new Parent());
    foreach(ChildVM child in children)
        parent.children.Add(child);
}

这里的问题是,ParentVM包含ChildVM,但是实际的父母(其是内部的ParentVM)没有孩子所包含的对象的ChildVM的对象。我也不认为这是一个很好的想法重复的儿童的对象,因为它会导致冗余和在我的应用程序方面也没有需要/种可能性,以创造新的儿童的对象。

我还以为关于以下类的设计:

class ParentVM {
    Parent _parent;

    string Name{return _parent.Name;}
    List<Child> children {get{return _parent.Children;}}
}

然而,这将意味着我会直接操作的模式如果我想要操纵ParentVM的儿童的对象。

另一方面我可以简单地离开(模型)父母的空白和使用ParentVM创建一个新的父母在该数据库。但这是一个很好的方式处理该问题?

有帮助吗?

解决方案

实际上,正确的方式做到这一点是当你第一次创造一个ParentVM,你迭代过儿童的传父,创造一个ChildVM每,那么添加这些ChildVM对ParentVM的ChildVMs财产。(有些人会只是叫这个酒店的"孩子"但是我个人喜欢被清除这是一个收集ChildVMs,没有一个集中的儿童的对象。简单地添加的'虚拟机后缀,使得这一非常明确的。

你然后还有听到变更通知的实际父母的儿童的收集和更新你的ChildVMs收集相应。

这样,你有一个模型与父>儿童-->儿童和一视图模型的ParentVM->ChildVMs->ChildVM这是我相信你想要什么。

现在我也相信,你应该能够获得父直接从ParentVM以及儿童直接从ChildVM因为你的用户界面可能会结合各种性质上的那些项目,诸如姓名的财产上。然而M-V-VM纯粹主义者会说永远不会做这种说UI应该永远不会知道的模型,因为如果模型的变化,你必须要更改用户界面。我的论点是,如果该模型的变化,你必须要改变模型,无论如何准确的同样的原因。唯一的储蓄将如果有几种意见的所有共同模型,因为你会只是要改变它在一个地方,但实际上,类似的东西'Name'并不能改变它是"名称"的模型,该模型使在这些情况下这是一个非参数。

另外,还有一个性能顶这样做的'纯粹主义者'的方式在,你不能简单地代表模型的项目喜欢你做的名字上述因为永远不会知道任何模型生成的更改名称的财产,除非你也加入的所有额外的更改通知内部的虚拟机,这意味着你现在有一个通知改变模型中的人的唯一目的是火灾 第二 变更通知在虚拟机,然后通知用户界面。纯净?是的。性能创的?你的赌注,特别是当大量的变化正在且正在使用该举的接口,因为这意味着你必须要做的串的比较在改变处理程序来检测和委托所有这些变化!如果你绑直接ParentVM.父母。名酒店不过,你就已经这一改变通知的模型,通知用户界面和你还保持虚拟机干净的东西,只是虚拟的或者视特定的。

什么我从来没有这样做,但是任何地方的模型这是仅查看信息。那对我来说是什么样的模型。因此,举例来说,如果孩子们有一个特定的色彩基础上的一枚举或什么的,那对我来说是这样的ChildVM和不该模型本身,并且如果有任何特性的模型,决定颜色,样一个酒店的那枚举,在这种情况下,是的,我要线上的改变-通知的模型内部ChildVM.(说实话,我甚至可能只是通过一个颜色的转换器在UI直接,仍然结合的模型的枚举。它真的一个案情况的事。)

禾田,

标记

其他提示

好吧,我得到了一些帮助和咨询意见。净论坛:我会解决的问题通过提供一个获取方法的模型内部视图模型.所以如果我创建了一个新的父母,现有的ChildVMs,我只是返回的儿童参考的内部ChildVMs并将它们分配给我的新的父母。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top