首页 > 解决方案 > 使用视图模型中的属性值实现方法的最佳实践是什么?

问题描述

我目前正在开发一个 UWP 应用程序,但我认为这个问题适用于任何具有 UI 的项目类型。我使用新的 Microsoft Toolkit MVVM 库为我的 UI 构建了一个视图模型。它具有以下属性:

        private bool _isLoginAvailable = true;     
        public bool IsLoginAvailable
        {
            get => _isLoginAvailable;
            set => SetProperty(ref _isLoginAvailable, value);
        }

此外,我有一些业务方法作为参数需要多达 5-6 个这些属性。

在论坛上阅读,我发现视图模型中的业务逻辑是不明智的,因此,我提出了以下选项:

  1. 为方法创建一个新类,并使用视图模型作为参数:SampleMethod(SampleViewModel vm). 然后,如果我在视图模型中创建此类的对象,我可以使用SampleMethod(this). 在这一点上,我真的看不出这个选项和在视图模型类中包含方法之间的区别。
  2. 我看到的第二个选项是将每个必需的参数添加到方法中,并在元组中返回每个参数:SampleMethod(var1, var2, var3...) { return (var1, var2, var3...)}这对我来说似乎很麻烦。
  3. 我想到的第三个选项是使用 MVVM Toolkit 的消息传递功能。在这种情况下,我可以设置视图模型的构造函数来监听消息 Messenger.Register<SampleViewModel, Var1Message>(this, (r, m) => r.var1 = m.Value);。然后,不同类中的方法可以使用Messenger.Send(new Var1Message(message). 虽然这似乎是最好的选择,因为它可以与依赖注入一起轻松实现,但很快就会变得非常复杂,因为每个属性都需要一个新的密封类来描述消息。

这些选项中的任何一个是最佳实践,还是有一个我不知道的选项?

标签: c#mvvmuwpviewmodelwindows-community-toolkit

解决方案


如果业务方法需要 VM 中的多个属性,那么这些属性是否应该在业务对象中?这些属性是业务规则所固有的,还是仅存在于视图的上下文中?

VM 属性可以直接传递给业务属性,或者您通常可以直接在 VM 中公开业务对象本身。


推荐阅读