WPF MVVM模式实践
2014-01-03 11:20
323 查看
<一>关于在WPF中使用MVVM模式开发的数据绑定问题
在MVVM中事件通过Command属性的绑定实现,在后台使用RelayCommand类型实现一个命令,并且在这个属性中调用事件处理函数。但是在DataTemplete中,如果只是简单的绑定了一个RelayCommand属性,将发生不会触发事件处理函数的情况,这种情况下。应该这样做:
(1)引用ViewModel的命名空间。xmlns:local="clr-namespace:MiniSize.Entity.ViewModel"[[BR]]
(2)将一个ViewModel设置为资源
<Page.Resources>
<local:SearchViewModel x:Key="searchviewmodel"/>
</Page.Resources>
(3)
<Hyperlink x:Name="edit_hlk" Command="{Binding Source={StaticResource? searchviewmodel},Path=EditCommand?}" CommandParameter?="{Binding}">编辑</Hyperlink>
<Hyperlink x:Name="delete_hlk" Command="{Binding Source={StaticResource? searchviewmodel},Path=DelCommand?}" CommandParameter?="{Binding}">删除</Hyperlink>
OK!perfect~
付一个小方法:查看绑定的错误信息。在调试中,选择选项和设置,选择左侧输出窗口,将右侧的绑定项属性改为所有,就可以在程序运行时的输出窗口看到有关绑定的问题。 (上面所遇到的问题就是,Path错误导致的)。
<二>MVVM页面跳转问题
WPF程序打开新的窗口,直接使用new window()即可,在这里记录的是使用一个 window 多个Page之间实现跳转。 主要使用的是Frame实现跳转,具体代码如下: (1)((Frame)System.Windows.Application.Current.MainWindow?.Content).NavigationService?.Navigate(Uri
uri,Object model); (2)((Frame)System.Windows.Application.Current.MainWindow?.Content).NavigationService?.Navigate(Object
root);
方法(2)的参数就是要跳转的页的实例。
<三>MVVM页面间传值问题
在页面跳转过程中往往需要传递一个值给新的页面,这样的做法在普通的WPF程序中很容易实现,但是在MVVM模式中,有一种较为通用的解决
办法。代码如下:
在接收值的VIewModel中:
GalaSoft?.MvvmLight?.Messaging.Messenger.Default.Register<MiniSize?.Models.Model>(this,
(model) =>
{
数据操作,model为一个参数,他是一个Model类型的实例。
});
在发送值得ViewModel中:
Messenger.Default.Send<MiniSize?.Models.Model>(model as MiniSize?.Models.Model);
具体的执行过程是,当发送端执行到send方法时,会跳转到register的具体数据操作方法中执行。 需要注意的是,register必须在send存在之前而存在,也就是说在send 之前,程序必须知道有一个地方存在一个Register 否则的话在程序第一次传值的时候是不会接收到的,只有在第二次的时候才会接收到。
在MVVM中事件通过Command属性的绑定实现,在后台使用RelayCommand类型实现一个命令,并且在这个属性中调用事件处理函数。但是在DataTemplete中,如果只是简单的绑定了一个RelayCommand属性,将发生不会触发事件处理函数的情况,这种情况下。应该这样做:
(1)引用ViewModel的命名空间。xmlns:local="clr-namespace:MiniSize.Entity.ViewModel"[[BR]]
(2)将一个ViewModel设置为资源
<Page.Resources>
<local:SearchViewModel x:Key="searchviewmodel"/>
</Page.Resources>
(3)
<Hyperlink x:Name="edit_hlk" Command="{Binding Source={StaticResource? searchviewmodel},Path=EditCommand?}" CommandParameter?="{Binding}">编辑</Hyperlink>
<Hyperlink x:Name="delete_hlk" Command="{Binding Source={StaticResource? searchviewmodel},Path=DelCommand?}" CommandParameter?="{Binding}">删除</Hyperlink>
OK!perfect~
付一个小方法:查看绑定的错误信息。在调试中,选择选项和设置,选择左侧输出窗口,将右侧的绑定项属性改为所有,就可以在程序运行时的输出窗口看到有关绑定的问题。 (上面所遇到的问题就是,Path错误导致的)。
<二>MVVM页面跳转问题
WPF程序打开新的窗口,直接使用new window()即可,在这里记录的是使用一个 window 多个Page之间实现跳转。 主要使用的是Frame实现跳转,具体代码如下: (1)((Frame)System.Windows.Application.Current.MainWindow?.Content).NavigationService?.Navigate(Uri
uri,Object model); (2)((Frame)System.Windows.Application.Current.MainWindow?.Content).NavigationService?.Navigate(Object
root);
方法(2)的参数就是要跳转的页的实例。
<三>MVVM页面间传值问题
在页面跳转过程中往往需要传递一个值给新的页面,这样的做法在普通的WPF程序中很容易实现,但是在MVVM模式中,有一种较为通用的解决
办法。代码如下:
在接收值的VIewModel中:
GalaSoft?.MvvmLight?.Messaging.Messenger.Default.Register<MiniSize?.Models.Model>(this,
(model) =>
{
数据操作,model为一个参数,他是一个Model类型的实例。
});
在发送值得ViewModel中:
Messenger.Default.Send<MiniSize?.Models.Model>(model as MiniSize?.Models.Model);
具体的执行过程是,当发送端执行到send方法时,会跳转到register的具体数据操作方法中执行。 需要注意的是,register必须在send存在之前而存在,也就是说在send 之前,程序必须知道有一个地方存在一个Register 否则的话在程序第一次传值的时候是不会接收到的,只有在第二次的时候才会接收到。
相关文章推荐
- 走向.NET架构设计—第五章—业务层模式,原则,实践(中篇)
- 深入PHP面向对象、模式与实践——高级特性(6)
- 观察者模式在android 上的最佳实践
- SCSF 系列:Smart Client Software Factory 中 MVP 模式最佳实践
- 强烈推荐敏捷软件开发:原则、模式与实践(C#版 英文注释版)
- Zebra命令模式分析(二) - 实践
- 英国电信设计模式最佳实践
- ASP.NET 实践:在 Web 部件页面中更改显示模式
- 《敏捷软件开发 原则、模式与实践 C#版》 - 书摘精要
- MongoDB副本模式在视频行业的应用实践
- 设计模式讲解与代码实践(二十四)——访问者
- 读《深入php面向对象、模式与实践》有感(三)
- 推荐:《敏捷软件开发、原则、模式与实践》电子版
- 深入PHP面向对象、模式与实践——企业模式(3)
- 操作系统实践(4)——从保护模式返回实模式
- .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
- 浅谈MVP模式及其在Android中的实践
- 云计算与行业,第 1 部分: PaaS 最佳实践和模式
- Linux学习笔记(十八) vim(二)、编辑模式、vim实践练习
- 【Java高并发最佳实践】线程安全的单实例模式