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

本文共 3646 字,大约阅读时间需要 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://ugbja.baihongyu.com/

你可能感兴趣的文章
tmux 配置
查看>>
回归自然的有机主题网站
查看>>
优化表的数据类型
查看>>
FileAccess枚举
查看>>
WCF消息队列
查看>>
2012年最有用的50款 jQuery 插件集锦——《表单篇》
查看>>
EF架构~单表一对多集合的插入(树型结构)
查看>>
c的socket教程 - 二进制 - 博客频道 - CSDN.NET
查看>>
iphone开发实现单选框
查看>>
keymaster -快捷键管理器
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
linux编程学习笔记(十二) 遍历目录
查看>>
华为综合面被刷,写点经验,以备后用
查看>>
Apache服务器SSL双向认证配置
查看>>
hdu 1671 Phone List(字典树)
查看>>
论数据库访问组件的选择--火地晋大作读后感
查看>>
php socket服务端和OC客户端(简单的测试)
查看>>
Dialog with HTML skin using CDHtmlDialog and SetWindowRgn
查看>>
看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)
查看>>
回车替换Tab 并不会 提交表单 IE Chrome 通过
查看>>