使用视图模型中的属性值实现方法的最佳实践是什么?
What is the best practice to implement methods using values of properties in the View Model?
我目前正在开发 UWP 应用程序,但我认为这个问题适用于具有 UI 的任何项目类型。我使用新的 Microsoft Toolkit MVVM 库为我的 UI 构建了一个视图模型。它具有如下属性:
private bool _isLoginAvailable = true;
public bool IsLoginAvailable
{
get => _isLoginAvailable;
set => SetProperty(ref _isLoginAvailable, value);
}
此外,我有一些业务方法作为参数需要多达 5-6 个这些属性。
在论坛上阅读,我看到视图模型中的业务逻辑不被建议,因此,我想出了以下选项:
- 为方法创建一个新的 class,并将视图模型用作参数:
SampleMethod(SampleViewModel vm)
。然后,如果我在视图模型中创建这个 class 的对象,我可以使用 SampleMethod(this)
。在这一点上,我真的看不出这个选项和在视图模型 class. 中包含方法之间的区别
- 我看到的第二个选项是将每个必需的参数添加到方法中,并且 return 每个参数也在一个元组中:
SampleMethod(var1, var2, var3...) { return (var1, var2, var3...)}
这对我来说似乎很麻烦。
- 我想到的第三个选项是使用 MVVM 工具包的消息传递功能。在这种情况下,我可以设置视图模型的构造函数来侦听带有
Messenger.Register<SampleViewModel, Var1Message>(this, (r, m) => r.var1 = m.Value);
的消息。然后,differenct class 中的方法可以使用 Messenger.Send(new Var1Message(message)
发送消息中的值。虽然这似乎是最好的选择,因为它可以很容易地与依赖注入一起实现,但它很快就会变得非常复杂,因为每个 属性 都需要一个新的密封 class 来描述消息。
这些选项中的任何一个是最佳实践吗,或者是否有我不知道的选项?
为什么您认为在 ViewModel 中使用方法是不可取的?
ViewModel 必须充当视图、模型和业务逻辑 类 或库之间的中介。
考虑在您的 ViewModel 中使用 RelayCommand(将 属性 实现为 ICommand 类型),这可以绑定到按钮单击并用于在您的 ViewModel 中调用采用 属性 值并将它们传递给您的业务逻辑。
ViewModel 的典型场景可能是用户在表单上输入,ViewModel 属性被视图绑定。然后用户单击按钮提交此数据。
如果业务方法需要您的 VM 中的多个属性,那么也许这些属性应该在业务对象中?这些属性是业务规则固有的,还是只存在于视图的上下文中?
VM 属性可以直接传递给业务属性,或者通常您可以直接在 VM 中直接公开业务对象本身。
我目前正在开发 UWP 应用程序,但我认为这个问题适用于具有 UI 的任何项目类型。我使用新的 Microsoft Toolkit MVVM 库为我的 UI 构建了一个视图模型。它具有如下属性:
private bool _isLoginAvailable = true;
public bool IsLoginAvailable
{
get => _isLoginAvailable;
set => SetProperty(ref _isLoginAvailable, value);
}
此外,我有一些业务方法作为参数需要多达 5-6 个这些属性。
在论坛上阅读,我看到视图模型中的业务逻辑不被建议,因此,我想出了以下选项:
- 为方法创建一个新的 class,并将视图模型用作参数:
SampleMethod(SampleViewModel vm)
。然后,如果我在视图模型中创建这个 class 的对象,我可以使用SampleMethod(this)
。在这一点上,我真的看不出这个选项和在视图模型 class. 中包含方法之间的区别
- 我看到的第二个选项是将每个必需的参数添加到方法中,并且 return 每个参数也在一个元组中:
SampleMethod(var1, var2, var3...) { return (var1, var2, var3...)}
这对我来说似乎很麻烦。 - 我想到的第三个选项是使用 MVVM 工具包的消息传递功能。在这种情况下,我可以设置视图模型的构造函数来侦听带有
Messenger.Register<SampleViewModel, Var1Message>(this, (r, m) => r.var1 = m.Value);
的消息。然后,differenct class 中的方法可以使用Messenger.Send(new Var1Message(message)
发送消息中的值。虽然这似乎是最好的选择,因为它可以很容易地与依赖注入一起实现,但它很快就会变得非常复杂,因为每个 属性 都需要一个新的密封 class 来描述消息。
这些选项中的任何一个是最佳实践吗,或者是否有我不知道的选项?
为什么您认为在 ViewModel 中使用方法是不可取的?
ViewModel 必须充当视图、模型和业务逻辑 类 或库之间的中介。
考虑在您的 ViewModel 中使用 RelayCommand(将 属性 实现为 ICommand 类型),这可以绑定到按钮单击并用于在您的 ViewModel 中调用采用 属性 值并将它们传递给您的业务逻辑。
ViewModel 的典型场景可能是用户在表单上输入,ViewModel 属性被视图绑定。然后用户单击按钮提交此数据。
如果业务方法需要您的 VM 中的多个属性,那么也许这些属性应该在业务对象中?这些属性是业务规则固有的,还是只存在于视图的上下文中?
VM 属性可以直接传递给业务属性,或者通常您可以直接在 VM 中直接公开业务对象本身。