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模式(简略介绍)相关推荐

  1. WPF中Mvvm模式的理解

    1. Mvvm是什么,Mvvm是怎么来的? Mvvm模式广泛应用在WPF项目开发中,使用此模式可以把UI和业务逻辑分离开,使UI设计人员和业务逻辑人员能够分工明确. Mvvm模式是根据MVP模式来的, ...

  2. WPF中MVVM模式的 Event 处理

    WPF的有些UI元素有Command属性可以直接实现绑定,如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢? 答案就是使用EventTrigger可以实现. 继 ...

  3. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  4. 【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF

    [翻译]WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF 目录  隐藏 引言 [Introduction] 背景 [Background] ...

  5. 【WPF】MVVM模式的3种command

    原文:[WPF]MVVM模式的3种command 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL, ...

  6. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  7. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  8. WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)

    MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): 1 <Wi ...

  9. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

最新文章

  1. NET(C#):使用HttpWebRequest头中的Range下载文件片段
  2. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
  3. java.logging的重定向?
  4. 浅谈如何学习linux
  5. python 导入数据对不齐_[Python] 大文件数据读取分析
  6. 淘宝美工实用素材|轻松交作业过稿
  7. linux下重启tomcat,日志查看
  8. 数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法...
  9. make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all] 错误 2 解决方法...
  10. 易云维医院后勤管理系统浅谈医院空调设备管理的问题及优化建议
  11. 微信公众平台源码分享,把你的生意做到微信里
  12. 三个非负整数 马蹄集
  13. 2021-04-20论文——视网膜识别技术作为绵羊生物识别方法的评价
  14. 实现用户注册功能的代码
  15. 论文查重是怎么查的?有什么规定?
  16. 人体捕捉:《SMPL-X》
  17. NLP-基础任务-中文分词算法(3)-基于字:基于序列标注的分词算法【BiLSTM+CRF】
  18. 一个有意思的小故事,希望以后也有这种修养,也能这样厚道
  19. 安装apk报错“解析包时出现问题”
  20. NBUT 1119 Patchouli's Books (STL应用)

热门文章

  1. LeetCode 5353. 灯泡开关 III
  2. 1094 谷歌的招聘 (20分)
  3. Python链表学习
  4. 列举python的数据类型_Python的数据类型
  5. python接口测试_测试大牛都会的接口测试+Python测开+Linux技能+Git命令合集!
  6. 轮播 一张中间 两张在旁边_黄渤为《五哈》做海报,邓超陈赫都只有一张,唯独对鹿晗待遇不同...
  7. SAP License:SAP顾问是如何炼成的——SAP到底是什么?
  8. 井电双控智能缴费管理系统、水井管理、报警管理、费用管理、实时查询、信息配置、模块配置、智能报表、水表、抄表、井电、电表、用水分析、水电、灌溉用水、绿化用水、农业用水、智慧水电、水利
  9. Hibernate处理MySQL的时间
  10. Linux基础-5进程管理工具