博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
阅读量:6480 次
发布时间:2019-06-23

本文共 3650 字,大约阅读时间需要 12 分钟。

原文:

这是我辅导的一个项目开发中的例子,他们是用WPF做界面开发,在学习了如何使用MVVM来实现界面与逻辑的分离,并且很好的数据更新之后,有一个疑问就是,这种双向的数据更新确实很不错,但如果我们希望用户可以撤销修改怎么办呢?其实这个功能,很早就有,甚至在原先的Windows Forms里面也可以实现。秘密就是实现IEditableObject这个接口。

关于这个接口的官方文档在这里:

 

我做了一个小的例子,帮助大家来理解。该例子使用了MVVM这种设计模式,如果你对此不熟悉,请先参考:

这个例子,你可以通过  进行下载

Model:Employee

using System.ComponentModel;namespace WpfApplicationBindingSample.Models{    ///     /// 业务实体(Business Entity)    ///     class Employee : INotifyPropertyChanged,IEditableObject    {        private string _firstName;        public string FirstName        {            get { return _firstName; }            set            {                if (_firstName != value)                {                    _firstName = value;                    if (PropertyChanged != null)                    {                        PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));                        PropertyChanged(this, new PropertyChangedEventArgs("FullName"));                    }                }            }        }        private string _lastName;        public string LastName        {            get { return _lastName; }            set            {                if (_lastName != value)                {                    _lastName = value;                    if (PropertyChanged != null)                    {                        PropertyChanged(this, new PropertyChangedEventArgs("LastName"));                        PropertyChanged(this, new PropertyChangedEventArgs("FullName"));                    }                }            }        }        public string FullName        {            get            {                return FirstName + "," + LastName;            }        }        public event PropertyChangedEventHandler PropertyChanged;        private Employee backup;//用这个字段来保存一个备份数据        public void BeginEdit()        {            //开始编辑,此时将当前的状态保存起来,以便后续可以根据情况提交或者撤销更改            backup = this.MemberwiseClone() as Employee;//通过克隆的方式直接地复制一份数据        }        public void CancelEdit()        {            //撤销编辑,此时将对象状态恢复到备份的状态            this.FirstName = backup.FirstName;            this.LastName = backup.LastName;        }        public void EndEdit()        {            //结束编辑,这里可以不做任何事情,也可以添加一些额外的逻辑        }    }}

 

 

ViewModel:

using GalaSoft.MvvmLight;using GalaSoft.MvvmLight.Command;using System.Windows;using WpfApplicationBindingSample.Models;namespace WpfApplicationBindingSample.ViewModels{    ///     /// 视图模型:专门用来为界面(视图)来服务的,这里用来包含一些业务逻辑    ///     class MainWindowViewModel : ViewModelBase    {        public MainWindowViewModel()        {            CurrentEmployee = new Employee()            {                FirstName = "ares",                LastName = "chen"            };        }        public Employee CurrentEmployee { get; set; }        public RelayCommand EditCommand {            get {                return new RelayCommand(() => {                    //将该员工设置为开始编辑                    CurrentEmployee.BeginEdit();                });            }        }        ///         /// 使用命令的机制代替了事件        ///         public RelayCommand SubmitCommand        {            get            {
//使用匿名方法 return new RelayCommand(() => { //结束编辑,让更改生效 CurrentEmployee.EndEdit(); MessageBox.Show(CurrentEmployee.FullName); }); } } public RelayCommand CancelCommand { get { return new RelayCommand(() => { CurrentEmployee.CancelEdit();//取消编辑,此时可以看到FullName那个标签的文本恢复到原来的值 }); } } }}

 

 

View:

 

转载地址:http://mvfuo.baihongyu.com/

你可能感兴趣的文章
Java文件清单列表
查看>>
js url传值中文乱码之解决之道
查看>>
Trusty TEE
查看>>
[LeetCode] Reverse String 翻转字符串
查看>>
学习iOS【3】数组、词典和集合
查看>>
Hessian 原理分析--转
查看>>
转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
查看>>
easyui传入map的数据前台展示出tree格式数据
查看>>
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>
java.math.BigDecimal
查看>>
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>