【问题标题】:c# MVVM presentation logicc# MVVM表示逻辑
【发布时间】:2013-03-24 20:53:26
【问题描述】:

我是 MVVM 模式的新手。

视图有一个登录按钮和一个进度条。

我有一个名为 LoginViewModel 的视图模型,它公开命令 LoginCommand 并连接到我的视图 LoginPage.xaml。

当登录命令被执行时,登录按钮应该被禁用并且进度条应该变得可见。

如果登录失败,登录按钮应该被启用并且进度条应该被隐藏。

我不确定的是这个表示逻辑应该发生在哪里。它应该发生在视图模式还是页面后面的代码中?

目前我在视图模型上有一个名为 LoggingIn 的布尔属性,当登录过程开始时设置为 true,如果失败则设置为 false。该布尔值分别与按钮和进度条的 IsEnabled 和 Visibility 属性挂钩。

这对我来说是错误的,所以我尝试制作几个事件,OnBeginLogin 和 OnEndLogin,并将它们连接到页面后面的代码中,这些代码用于控制控件的视觉状态。然而,这比以前的解决方案需要更多的代码。

虽然我也可以在视图模型中公开两个特定于控件的属性 LoginButtonEnabled 和 ProgressBarVisible,以便我可以从视图模型控制视觉状态。但是,如果我添加一个取消按钮,那么我需要添加另一个名为 CancelButtonEnabled 的属性。

我认为不应在视图模型中处理表示逻辑,因此添加事件似乎是最佳解决方案,但我想知道最佳实践或标准/常用方法是什么?

另外,当登录成功时,是否应该在视图模型或页面后面的代码中处理用户返回上一页或另一页?再次我觉得这不是视图模型的东西,但我不确定。

感谢您的帮助。

【问题讨论】:

  • 是的,您绝对正确添加状态另一个按钮的新属性。这就是为什么这称为 ViewModel。
  • 您是否尝试过使用 DataTriggers 在 xaml 中处理您的表示逻辑?如果你有复杂的表示逻辑,你可以使用 valueconverters 来处理逻辑并返回一个 DataTrigger 可以理解的值。

标签: c# wpf xaml mvvm


【解决方案1】:

我不知道你为什么感觉不对,但你的第一种方法对我来说似乎是最正确的。视图模型正确地将应用程序的状态暴露给视图,然后您使用数据绑定来控制如何将其转换为表示。

【讨论】:

  • 我认为这感觉不对,因为要传达状态更改,您通常会使用枚举类型或事件的属性。对于我的简单情况,一个布尔值可以,但是如果你有一个用于查看、编辑和插入的页面,你会拥有三个枚举值“查看”、“编辑”和“插入”而不是 IsEditing、IsInserting 但你不能使用枚举类型在 xaml 中很容易,所以我认为必须有一种标准的方式来处理视图状态的变化。
  • 登录成功后,视图模型应该导航到另一个页面还是应该在页面后面的代码中完成?
  • 我会导航到另一个用户控件。您连接应用程序的方式可能会有所不同。我通常只有一个 MainWindow(好吧,我也有一个 PopupWindow,但这无关紧要)。我在我的 MainWindow 上放置了一个用户控件,它连接到我的 MainViewModel 上的 viewmodel 属性。当我想“更改”屏幕时,我会更改 MainViewModel 上的 viewmodel 属性。我的 MainWindow(或字典)上的 DataTemplates 检测到 viewmodel 已更改并加载不同的用户控件 => 屏幕更改
  • viewModel 必须是 UI 的可测试表示。因此,您的第一种方法,或者视图模型中特定于控件的两个属性是 MVVM 中最正确的方法。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2017-04-29
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多