【发布时间】:2018-08-02 04:35:39
【问题描述】:
“应该”视图逻辑通常驻留在哪里?在视图中(包括后面的代码)还是在视图模型中?
根据逻辑,我了解用于修改视图(使其动态化)、更改其元素属性的任何内容:Visibility、IsEnabled、Content 等,基于一些条件 .
我在选择正确的陈述之间挣扎:
ViewModel 负责所有视图“属性”,如果视图需要一些逻辑 - 这应该是 viewmodel 的工作。
View 是一个 viewmodel 展示,viewmodel 只需要最低限度的暴露模型,因此逻辑应该是视图的一部分。
视图中的逻辑。
一个例子,显示一些文本:
<Grid Visibility="{Binding TextAvailable, Converter=...}">
<TextBlock Text="{Binding Text}" Visibility="{Binding TextOk, Converter=...}" />
</Grid>
通过查看这个 xaml,您知道 viewmodel 中有 2 个属性:TextAvailable 和 TextOk,用于有条件地显示 Text。
同样可以使用数据触发器来实现。方式无关,重点是:逻辑在视图中。必须彻底浏览视图才能理解两者:逻辑和实现。
视图模型中的逻辑。
Xaml 更简单:
<TextBlock Text="{Binding Text}" Visibility="{Binding ShowText, Converter=...}" />
并且逻辑在视图模型中:
public bool ShowText => TextAvailable && TextOk;
但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够告诉视图OnPropertyChanged(nameof(ShowText))如果任何相关属性发生更改.因此,实现很好地分布在许多方法/属性中。
我个人更喜欢简单的视图模型和相当复杂的视图(xaml),充满逻辑。最近我found a way 让逻辑看起来真的很酷(没有额外的元素,更容易看到)。
我了解这两种方法都可以使用什么,因此问题是相当基于意见的,但我不想在我的软件中以疯狂的比例混合这两种方法。哪种方式更干净并且会更好地被另一个 MVVM 程序员接受?我应该更喜欢什么,为什么?
【问题讨论】:
-
因此问题是基于意见的。确切地。我们真的无法判断哪种方法在客观上会更好。在我看来,如果您打算在另一个视图中重用某个逻辑,它应该在视图模型中实现。否则它应该在视图中。
-
@ZoharPeled:不是真的——ViewModel 应该做 UI 逻辑,并将业务逻辑委托给另一层。 View 负责任何可见的东西,所以它可以包含 C#,只要是关于渲染和样式的。
-
@Sinatr - 你关于(弱)事件的 cmets 无法说服我,你总是需要一些东西来让 ViewModel 保持最新状态,无论你在哪里与 View 划清界限。跨度>
-
MVVM 的目标是保持 View 的简洁性,并在 ViewModel 中提供一个“抽象的、不显眼的”UI,这样可以更容易地进行测试。