“应该”视图逻辑通常驻留在哪里?在视图中(包括后面的代码)还是在视图模型中?
从逻辑上讲,我理解用于修改视图(使其动态)、更改其元素属性的任何内容:Visibility
, IsEnabled
, Content
等基于一些状况.
我在选择正确的陈述之间挣扎:
ViewModel 负责所有视图“属性”,如果视图需要一些逻辑 - 这应该是 viewmodel 的工作。
视图是视图模型的呈现,视图模型只需要最少的暴露模型,因此逻辑应该是视图的一部分。
视图中的逻辑。
一个例子,显示一些文本:
<Grid Visibility="{Binding TextAvailable, Converter=...}">
<TextBlock Text="{Binding Text}" Visibility="{Binding TextOk, Converter=...}" />
</Grid>
通过查看这个 xaml,您知道 viewmodel 中有 2 个属性:TextAvailable
and TextOk
,用于有条件地显示Text
.
使用数据触发器也可以实现同样的效果。方式无关紧要,重点是:逻辑在视图中。人们必须彻底浏览视图才能理解以下两点:逻辑和执行.
视图模型中的逻辑。
Xaml 更容易:
<TextBlock Text="{Binding Text}" Visibility="{Binding ShowText, Converter=...}" />
and 逻辑在视图模型中:
public bool ShowText => TextAvailable && TextOk;
但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够tell风景OnPropertyChanged(nameof(ShowText))
如果任何相关属性发生更改。因此执行在许多方法/属性中广泛传播。
我个人更喜欢简单的视图模型和相当复杂的视图(xaml),充满逻辑。最近我找到了办法 https://stackoverflow.com/a/48525675/1997232让逻辑看起来非常酷(没有额外的元素并且更容易看到)。
我了解这两种方法都可以使用,因此问题是基于意见的,但我不想在我的软件中以疯狂的比例混合这两种方法。哪条路比较多clean并且会被另一个 MVVM 程序员更好地接受吗?我应该选择什么以及为什么?