【发布时间】: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 可以理解的值。