c# - MVVM - 查看逻辑 : view vs viewmodel

标签 c# wpf mvvm

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

3年前关闭。




Improve this question




“应该” View 逻辑通常驻留在哪里?在 View 中(包括后面的代码)还是在 View 模型中?

按照逻辑,我了解用于修改 View (使其动态),更改其元素属性的任何内容:Visibility , IsEnabled , Content等基于某些条件。

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

  • ViewModel 负责所有 View “属性”,如果 View 需要一些逻辑 - 这应该是 viewmodel 的工作。
  • View 是一个 View 模型表示, View 模型只需要最少的模型就可以公开,因此逻辑应该是 View 的一部分。

  • View 中的逻辑。

    一个例子,显示一些文本:
    <Grid Visibility="{Binding TextAvailable, Converter=...}">
        <TextBlock Text="{Binding Text}" Visibility="{Binding TextOk, Converter=...}" />
    </Grid>
    

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

    同样可以使用数据触发器来实现。方式无关,重点是:逻辑在 View 中 .一个人必须彻底了解两者:逻辑和。实现 .

    View 模型中的逻辑。

    Xaml 更简单:
    <TextBlock Text="{Binding Text}" Visibility="{Binding ShowText, Converter=...}" />
    

    逻辑在 View 模型中 :
    public bool ShowText => TextAvailable && TextOk;
    

    但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够告诉 View OnPropertyChanged(nameof(ShowText))如果任何相关属性(property)发生变化。因此实现 在许多方法/属性中很好地传播。

    我个人更喜欢简单的 View 模型和相当复杂的 View (xaml),充满逻辑。最近我found a way使逻辑看起来真的很酷(没有额外的元素,更容易看到)。

    我了解这两种方法都可以使用什么,因此问题是相当基于意见的,但我不想在我的软件中以疯狂的比例混合这两种方法。哪种方式更干净,更容易被其他 MVVM 程序员接受?我应该更喜欢什么,为什么?

    最佳答案

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

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

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

    归根结底,ViewModel 是为了支持 View:本质上是为它提供 View 的 UI 元素可以绑定(bind)的属性,从而提供两者可以通信的管道。您的选择,基于您要实现的 MVVM 的纯度,是您希望 ViewModel 支持多少 View,以及您希望 View 隔离多少。

    关于c# - MVVM - 查看逻辑 : view vs viewmodel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925516/

    相关文章:

    c# - 将复杂结构从 C++ 编码到 C#

    c# - 如何在WPF中进行多个项目的数据绑定(bind)

    wpf - 是否可以使用 ViewModel 第一种方法从 View 订阅 ViewModel 事件?

    c# - 如何测试数值转换是否会改变值?

    c# - 如何在 Windows Phone 8.1 中缓存页面

    c# - 选择分组结果

    c# - 如何在 VS2010 的 ListView 上测试或使用 DisconnectedItem?

    c# - 在 WPF 中无论如何都模糊图像

    c# - 在 WPF 中启动应用程序,如何不使用启动 uri,而是使用窗口实例

    wpf - 如何在 .NET Core 3 类库中运行 Dispatcher.Invoke()?