MVVM – 视图逻辑:view vs viewmodel

“应该”视图逻辑正常驻留在哪里? 在视图(包括后面的代码)或viewmodel中?

通过逻辑,我理解用于修改视图的任何内容(使其动态化),根据某些条件更改其元素属性: VisibilityIsEnabledContent等。

我在选择正确的陈述之间苦苦挣扎:

  1. ViewModel负责所有视图“属性”,如果视图需要一些逻辑 – 这应该是viewmodel的工作。

  2. View是一个viewmodel表示,viewmodel只需要最小的公开模型,因此逻辑应该是视图的一部分。

视图中的逻辑。

举例来说,显示一些文字:

    

通过查看此xaml,您知道viewmodel中有2个属性: TextAvailableTextOk ,用于有条件地显示Text

使用数据触发器可以实现相同。 方式无关紧要,重点是: 逻辑在视图中 。 人们必须彻底了解两种观点:逻辑和实施

viewmodel中的逻辑。

Xaml更容易:

  

逻辑在viewmodel中

 public bool ShowText => TextAvailable && TextOk; 

但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够告知视图OnPropertyChanged(nameof(ShowText))是否有任何相关属性被更改。 因此, 实现在许多方法/属性中很好地分布。


我个人更喜欢拥有简单的viewmodel和相当复杂的视图(xaml),充满逻辑。 最近我发现了一种让逻辑变得非常酷的方法(没有额外的元素,更容易看到)。

我理解这两种方法都可以使用,因此问题基于意见,但我不想在我的软件中以疯狂的比例混合使用这两种方法。 哪种方式更干净,并且会被另一位MVVM程序员更好地接受? 我应该更喜欢什么?为什么?

我认为答案是做任何你觉得舒服的事情。 我不相信一种方法比另一方更客观。

我想在纯MVVM场景中,ViewModel不了解它的View,也不知道它的数据将如何显示。 在实践中,我认为这种情况很少遇到。 大多数情况下,在编写ViewModel代码时,您将很好地了解其数据将如何显示和交互:换句话说,您将知道View将会是什么样子,以及它将如何表现。

鉴于此,我认为在ViewModel中放置一些UI逻辑并不是一个问题。 我并不是指直接操纵View中的UI元素; 相反,在视图将绑定的ViewModel上具有属性,例如示例中的Boolean属性。 逻辑越复杂,我就越有可能将它放在ViewModel中,因为虽然您可以通过可见性转换器和数据触发器在View中执行逻辑,但XAML可能会变得非常冗长。 这并不是说我从不使用那些XAMLfunction,只是因为我通常会将它们用于更简单的逻辑。

在一天结束时,ViewModel支持View:基本上为它提供View的UI元素可以绑定的属性,从而提供两者可以通信的管道。 根据您要实现的MVVM的纯度,您的选择是希望ViewModel支持View的程度,以及您希望隔离View的程度。

在我看来

2.View是一个viewmodel表示,viewmodel只需要最小的公开模型,因此逻辑应该是视图的一部分。

听起来更正确。

什么属于“最低限度”取决于业务逻辑要求 (例如,必须显示警告,因为法律要求,这种属性属于VM)和设计师的天赋 。 所以业务逻辑不属于视图!

问题“如果您将UIElementA作为UIElementB的DataContext,那么UIElementA是否属于View或ViewModel?” 从图中可以看出,UIElementA UIElementB可以被视为VM,但UIElementB实际上不是VM。
因此,作为DataContext的一些类(也不依赖于表示框架)可以并且应该放到视图层(OP强迫我重新考虑一些类的分配)。

总结一下:
ViewModel中依赖UI的逻辑 越少越好 ,但在合理范围内。