2010-06-25 66 views
1

在维护模型 - 视图模型关系(例如,为模型的每个实例创建vm实例)之后争斗了一段时间,我有一些可能颇有争议的想法,但我好奇的意见。MVVM和从模型到视图模型的隐式转换

如果使用VM类来维护模型实例的静态容器列表会怎么样? 那些可能(甚至应该)是弱引用,所以无论何时模型类实例超出范围,它的视图模型都会自动处理。另一个选择是重用虚拟机实例。

另一种适用于第一种方法的想法可能是创建一个从模型到视图模型类的隐式转换运算符。每当从模型实例投射时,我总是会获得同样的vm实例。

您对此有何看法?这是否违反规则和MVVM模式?

//编辑 我应该也可以提供这背后的动机:在我的应用程序中,我有多个地方使用我的模型类之一,并需要相应的vm引用。在每个这样的地方,我需要观察一个集合并对变化做出反应 - 创建或删除虚拟机实例。这与在许多地方重复的代码基本相同=>我认为只创建一个地方来做到这一点(隐式转换只是一个糖果,它不需要解决实际问题)。或者,也许而不是静态列表我应该创建一个管理器来处理所有类的视图模型实例创建?

+0

现在几年后,你有没有发现一些缺点?看到基本上重复的代码会很有趣,但我不认为这是正确的? – WiiMaxx 2015-07-22 13:53:26

回答

0

首先,我不确定您的想法是否违反了MVVM模式。在我看来,每种情况下填充模式都不是那么重要。我眼中的一种模式提出了解决问题的策略。在大多数情况下,通过一切手段100%是不值得的。如果有一个实用的解决方案,你应该使用这个。当然,这应该是引导你达到目标的解决方案,例如单元测试,UI分离和应用逻辑等。

无论如何,当我第一次读你的文章时,我认为实现一个演员操作符是个好主意。但如果我没有错,则需要在模型中引用视图模型。我总是尽量避免这一点,以最大限度地利用重复使用机会。但我认为有这样的参考并不违反这种模式。也许别人可以更多地了解这一点。

对我而言,您的经理主意是最好的方法。我使用类似的方式来创建视图模型。这取决于您需要创建多少个视图模型,但您应该创建新视图模型而不是重新使用现有视图模型。在某处我读到视图模型应该是某种状态机的视图。遵循这个想法,当你重复使用视图模型时,你永远不知道视图模型是在什么状态。所以首选的方法是创建一个新的视图模型。

只是有些想法!也许有一些其他的想法...

+0

谢谢您的回答:)简单评论一下:我想听取关于这种方法可能存在的缺点的意见,因此我的问题可能有点偏离轨道。这里的另一件事是我没有任何模型耦合来查看模型。隐式转换操作符可能在这两种属于转换类型的类型上定义,所以在这种情况下,我将在vm类中定义它。 关于vm是一个用于视图的状态机,你是完全正确的,所以可重用的vm实例可能不是一个好的解决方案。 – kubal5003 2010-06-25 10:15:25

+0

我真正需要的是每个使用它的上下文的一个vm实例,因此这变得非常棘手。另一种方法可能是为不同的上下文定义不同的属性/事件,但是如果我需要两个非常类似的用法,那可能会导致相当大的混乱。我将不得不考虑更多.. ViewModel管理器现在似乎是一个更好的选择,因为它提供了更多的灵活性和能力来使用更多的信息(如上下文) – kubal5003 2010-06-25 10:20:11