WPF使用MVVM设计模式 问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF使用MVVM设计模式 问题相关的知识,希望对你有一定的参考价值。
学习了下相关知识,知道
view做展示,数据绑定;
viewmodel做命令提供,绑定的数据
model做业务逻辑
大概流程是view生成命令然后通知viewmodel,view分配给model处理后,修改相关数据,然后因为数据后view绑定,所以自动修改ui界面。
现在有个问题,比如我点击页面A一个按钮,需要跳转到页面B,同时页面B一展示就需要数据支持。那么这个跳转到下个页面的代码,是写在view呢,还是写在viewmodel。大概怎么写。
求高手解答给小弟,有demo,小弟额外加100分。。。邮箱是914371502@qq.com
VIEWMODEL:界面的业务逻辑,也就是以前的XAML.CS文件
MODEL:你的业务数据模型
根据上面的定义,你应该写在VIEWMODEL上。两个VIEW之间的数据传递在MVVM中一律通过DataContext属性进行,DataContext在MVVM中至关重要!
MVVM的本质就是绑定,只是MVVM要求更严格,最正统的MVVM要求删除XAML的所有控件编程ID。
自己写MVVM非常容易出错,我推荐用simplemvvmtoolkit.(项目在codeplex中)。它有两个比较好用的地方,一个是属性改变通知用lamda表达式,这样当你用重构工具修改模型属性后PropertyChange里的属性名也会跟着改,避免了直接写属性字符串引起的错误。
还一个是它提供一个全局事件总线,DataContext数据交换要求两个ViewModel之间存在引用关系,但实际应用时不总是这样(如日志收集器界面)。通过这玩意可以多个ViewModel订阅事件,任意一个ViewModel发布事件其它订阅事件的ViewModel就能处理事件了。
simplemvvmtoolkit一个小问题就是用它的EventToCommand去绑定UserControl没效果,这一点mvvmlight(也在codeplex里)的RelayCommand就没问题,所以我做项目时一般是这两个库一起用。
通过simplemvvmtoolkit写MVVM你可以先把View画好、写出ViewModel和Model的模型定义,模型绑定全部可通过blend用鼠标完成,不许动用一下键盘。绑定完了只要专心填ViewModel的业务逻辑即可。 参考技术A 应该写在view里,可以使用消息订制,然后由viewmodel发送消息给view。
prism比较大,可以使用mvvmlight,轻型的,或者自己实现类似的
参考资料:http://www.galasoft.ch/mvvm/
参考技术B 顶我在使用 MVVM for WPF 实现命令处理器模式时遇到问题
【中文标题】我在使用 MVVM for WPF 实现命令处理器模式时遇到问题【英文标题】:I'm having an issue implementing the Command Processor pattern using MVVM for WPF 【发布时间】:2022-01-11 21:11:26 【问题描述】:我正在尝试使用用于 WPF 的 MVVM 实现命令处理器模式。我大致遵循的命令处理器模式是 Pattern-Oriented Software Architecture (Volume 1) 一书中描述的模式:
命令处理器设计模式将请求分开 从它的执行服务。命令处理器组件管理 请求作为单独的对象,安排它们的执行,并提供 附加服务,例如存储请求对象以供以后使用 撤消。
我的实现要求将所有可能撤消的 UI 操作存储为命令。这主要与 WPF 的命令兼容,文本框除外。 WPF 中的文本框不提供命令(与按钮和复选框不同)。
我想我通过添加一个TextChangedCommand
来解决这个问题,它在引发TextChanged
事件时执行,如下所示:
<l:CommandTextBox
Text="Binding Name, UpdateSourceTrigger=PropertyChanged"
TextChangedCommand="Binding SetNameCommand, Mode=OneWay"
/>
但问题是TextChangedCommand
不仅在用户进行更改时执行,而且在数据绑定属性更改时执行,这发生在撤消更改时。在撤消操作中,我只想将属性设置为之前的状态,而不是再次运行命令。
好像需要一个TextChangedByUserCommand
,但在我尝试实现它之前,我想知道我是否以错误的方式解决这个问题,或者是否有人提出了更清洁的解决方案。
【问题讨论】:
【参考方案1】:我的第一选择是跟踪撤消更改的操作并对更改做出反应。
private void ResetCommandTextbox()
//some stuff...
IsViewModelUndoing = true;
Name = oldValue;
IsViewModelUndoing = false;
public void TextChangedCommand(...)
if(IsViewModelUndoing)
return;
// your other stuff which your doing
【讨论】:
以上是关于WPF使用MVVM设计模式 问题的主要内容,如果未能解决你的问题,请参考以下文章