WPF中MVVM模式(简略介绍)
MVVM模式主要是为了实现视图和逻辑的分离,下面介绍一下完整实例:
① 首先是在数据部分,即Model层。在此定义AuthorVO类,其中包括所用的基本属性。
public class AuthorVO : INotifyPropertyChanged, IDataErrorInfo
{
#region 私有字段
private DateTime? _StartDate;
private DateTime? _EndDate;
private string _Name;
#endregion
public AuthorVO ()
{
this.CanShow = false;
this.CanEdit = false;
this.CanDelete = false;
}
/// <summary>
/// 复制一个等同于自己的实体
/// </summary>
public AuthorVO Copy()
{
return (AuthorVO )this.MemberwiseClone();
}
/// <summary>
/// 取得或设置ID
/// </summary>
public string ID
{
get;
set;
}
/// <summary>
/// 取得或设置编码
/// </summary>
public string Code
{
get;
set;
}
/// <summary>
/// 取得或设置姓名
/// </summary>
[Required(ErrorMessage = "航段名称不能为空!")]
public string Name
{
get
{
return _Name;
}
set
{
if (_Name != value)
{
_Name = string.IsNullOrEmpty(value) ? value : value.Trim();
OnPropertyChanged("Name");
}
}
}
② 其中在View和ViewModel层之间是通过数据绑定联系在一起的。
View层的xaml文件代码:
<Base:RadWindowBase x:Class="*.Client.View.*.*.*"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Beh="clr-namespace:OceanSample.Client.View.Extension"
xmlns:Base="clr-namespace:OceanSample.Client.View"
WindowStartupLocation="CenterScreen" Header="信息管理"
Padding="10" ResizeMode="NoResize"
>
<Control.InputBindings>
<KeyBinding Gesture="Ctrl+S" Key="S" Command="{Binding Path=SaveCommand}"/>
</Control.InputBindings>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="45"/>
<RowDefinition Height="110"/>
<RowDefinition Height="45"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="2" Grid.Row="2" Style="{StaticResource TextBlockStretchStyle}">
<Run>次序:</Run>
</TextBlock>
<telerik:RadMaskedTextBox ToolTip="次序" IsReadOnly="True"
Style="{StaticResource ResourceKey=RadMaskedTextBoxStretchStyle}"
Grid.Column="3" Grid.Row="2" TabIndex="5" x:Name="Order"
Value="{Binding Path=*.Order,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Margin="5,5,5,5" MaskType="None"
>
</telerik:RadMaskedTextBox>
<StackPanel Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="6" HorizontalAlignment="Center" Orientation="Horizontal" >
<telerik:RadButton Content="保存" Width="60" Height="30" TabIndex="11" Margin="5"
HorizontalAlignment="Center" HorizontalContentAlignment="Center"
Command="{Binding SaveCommand}"
/>
<telerik:RadButton Content="取消" Width="60" Height="30" HorizontalContentAlignment="Center" TabIndex="12"
HorizontalAlignment="Center" Margin="5" Command="{Binding CloseCommand}"
/>
</StackPanel>
</Grid>
</Base:RadWindowBase>
在后台代码中:
/// <summary>
/// Interaction logic for Author.xaml
/// </summary>
public partial class Author : RadWindowBase
{
public Author()
{
InitializeComponent();
DataContext = new AuthorViewModel();
}
}
③ 在ViewModel层,实现数据和界面之间的逻辑,在类中,包括了属性和命令,都将与界面进行数据绑定,
其中Command只能与具有Comman属性的控件进行绑定,否则就要采用其他的方式,但是在这里使用的是按钮,
所以可以进行。实现命令时,自定义命令时要实现ICommand接口,在UI界面中,一般会继承RouteCommand或是
RouteUICommand,这都是有弊端的,所以大家一般采用,自定义一个RelayCommand,但是要注册多个命令时,
定义将会有所改动。
ViewModel的定义代码:
public class AuthorViewModel : ViewModelClassBase
{
#region 私有字段
private BaseCommand _AddCommand;
//判断数据是否加载忙碌状态
private bool _IsBusy;
//每一行显示的信息数目
private int _PageSize = 20;
//定义的状态信息
private OperationStatus _OperationStatus;
#endregion
#region 构造函数
/// <summary>
/// 构造函数
/// </summary>
public AuthorViewModel()
{
_OperationStatus = new OperationStatus();
//加载数据
DataLoad(null);
//订阅实体(获得编辑界面发布的事件)
EventAggregatorForSubscribe.GetEvent<AddOrEditEntityHanleEvent>().Subscribe(AddOrEditLeg,
ThreadOption.PublisherThread, false, CanAddOrEdit);
}
#endregion
#region 绑定属性
/// <summary>
/// 添加
/// </summary>
public ICommand AddCommand
{
get
{
if (_AddCommand == null)
_AddCommand = new BaseCommand(Add, CanAdd);
return _AddCommand;
}
}
/// </summary>
public int PageSize
{
get
{
if (_PageSize < 0)
_PageSize = 0;
return _PageSize;
}
set
{
if (_PageSize != value && value >= 0)
{
_PageSize = value;
OnPropertyChanged("PageSize");
}
}
}
/// <summary>
/// 是否在加载数据
/// </summary>
public bool IsBusy
{
get
{
return _IsBusy;
}
set
{
if (_IsBusy != value)
{
_IsBusy = value;
OnPropertyChanged("IsBusy");
}
}
}
#endregion
#region 方法事件
/// <summary>
/// 添加命令方法
/// </summary>
/// <param name="obj"></param>
public void Add(object obj)
{
EventAggregatorForPublish.ShowControl("添加信息", "Display.*.*",
new List<object> { "*.Client.ViewModel.Display.*.*", new AuthorVO() });
}
#endregion
#region 权限
/// <summary>
/// 添加权限
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool CanAdd(object obj)
{
return !IsBusy;
}
#endregion
至此,程序框架基本建立。
转载于:https://www.cnblogs.com/Latent-Truth/archive/2013/05/21/3090875.html
WPF中MVVM模式(简略介绍)相关推荐
- WPF中Mvvm模式的理解
1. Mvvm是什么,Mvvm是怎么来的? Mvvm模式广泛应用在WPF项目开发中,使用此模式可以把UI和业务逻辑分离开,使UI设计人员和业务逻辑人员能够分工明确. Mvvm模式是根据MVP模式来的, ...
- WPF中MVVM模式的 Event 处理
WPF的有些UI元素有Command属性可以直接实现绑定,如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢? 答案就是使用EventTrigger可以实现. 继 ...
- CleanAOP实战系列--WPF中MVVM自动更新
CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...
- 【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF
[翻译]WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF 目录 隐藏 引言 [Introduction] 背景 [Background] ...
- 【WPF】MVVM模式的3种command
原文:[WPF]MVVM模式的3种command 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL, ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)
MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): 1 <Wi ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...
最新文章
- NET(C#):使用HttpWebRequest头中的Range下载文件片段
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
- java.logging的重定向?
- 浅谈如何学习linux
- python 导入数据对不齐_[Python] 大文件数据读取分析
- 淘宝美工实用素材|轻松交作业过稿
- linux下重启tomcat,日志查看
- 数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法...
- make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all] 错误 2 解决方法...
- 易云维医院后勤管理系统浅谈医院空调设备管理的问题及优化建议
- 微信公众平台源码分享,把你的生意做到微信里
- 三个非负整数 马蹄集
- 2021-04-20论文——视网膜识别技术作为绵羊生物识别方法的评价
- 实现用户注册功能的代码
- 论文查重是怎么查的?有什么规定?
- 人体捕捉:《SMPL-X》
- NLP-基础任务-中文分词算法(3)-基于字:基于序列标注的分词算法【BiLSTM+CRF】
- 一个有意思的小故事,希望以后也有这种修养,也能这样厚道
- 安装apk报错“解析包时出现问题”
- NBUT 1119 Patchouli's Books (STL应用)
热门文章
- LeetCode 5353. 灯泡开关 III
- 1094 谷歌的招聘 (20分)
- Python链表学习
- 列举python的数据类型_Python的数据类型
- python接口测试_测试大牛都会的接口测试+Python测开+Linux技能+Git命令合集!
- 轮播 一张中间 两张在旁边_黄渤为《五哈》做海报,邓超陈赫都只有一张,唯独对鹿晗待遇不同...
- SAP License:SAP顾问是如何炼成的——SAP到底是什么?
- 井电双控智能缴费管理系统、水井管理、报警管理、费用管理、实时查询、信息配置、模块配置、智能报表、水表、抄表、井电、电表、用水分析、水电、灌溉用水、绿化用水、农业用水、智慧水电、水利
- Hibernate处理MySQL的时间
- Linux基础-5进程管理工具