WPF之MVVM模式
创始人
2024-02-05 07:48:36
0

1.MVVM模式

MVVM即模型-视图-视图模型 ,是用于解耦 UI 代码和非 UI 代码的 设计模式。 借助 MVVM,可以在 XAML 中以声明方式定义 UI,将 UI使用数据绑定标到包含数据和命令的其他层。 数据绑定提供数据和结构的松散耦合,使 UI 和链接的数据保持同步,同时可以将用户输入路由到相应的命令。

 

 MVVM模式由M(Model),V(View),VM(ViewModel)三部分组成,其设计模式类似为MVC开发模式。目的是解耦UI和代码,编译编辑和修改。

通常一个View对应一个ViewModel,一个ViewModel可能包含n个model。

实际应用过程中可以对View中的不同控件绑定不同的ViewModel,变成一对多的模式。

2.View

 View即UI界面,wpf使用xaml编,xaml是在xml的基础上开发的,整体风格与xml有诸多类似之处。

2.1绑定数据

View界面中需要通过数据绑定将具体的数据绑定到ViewModel的对应属性上。

如上XAML中将DataGrid的ItemsSource属性绑定到列表,同时将对应列的数据绑定到列表的不同属性数据上。

2.2绑定事件

按钮不设置Click事件,该有使用Command属性绑定具体的方法,进而调用,同时使用CommandParameter属性传递UI界面参数给ViewModel,以便后台可以访问View的控件进行相关操作。

如果可以一般ViewModel不建议访问View中的控件,以便完全剥离UI和后台代码,便于移植。

2.3绑定ViewModel

    

通过设置窗体的DataContext属性绑定具体的ViewModel,此方法不需要后台实现ViewModel之后再绑定,可以直接系统实现ViewModel。

DataContext="{DynamicResource vm:AddSubItemViewModel}"

Xaml设置DataContext属性时需要单列绑定属性标签,如果在Window标签中绑定DataContext属性需要绑定静态的ViewModel,否则无法正常获取ViewModel数据。

        /// /// 构造函数/// public AddSubItemWindow(){InitializeComponent();this.DataContext = new AddSubItemViewModel();}

也可以在后台用用代码进行设置,再构造函数里用构造函数绑定ViewModel。

一般一个界面设定窗体的DataContext属性,不过实际使用可以对不同的孔家设置不同的DataContext属性。

3. ViewModel

ViewModel即View和Model的中间层,用于中转界面和具体实现代码。

3.1 实现INotifyPropertyChanged接口

ViewModel用于被绑定的数据需要使用INotifyPropertyChanged接口,才能做到UI界面和后台数据的实时变更通知,ViewModel数据更新后实时刷新界面View的数据。

    public class BaseNotifyPropertyChanged : INotifyPropertyChanged{/// /// 实现接口/// public event PropertyChangedEventHandler PropertyChanged;/// /// 属性变更事件/// /// 事件源public void OnPropertyChanged([CallerMemberName] string propertyName = ""){this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}

配置[CallerMemberName]属性可以自动获取属性名称作为委托参数的名称,省去代码调用时需要一个个输入委托参数名称。

3.2 基本属性参数

        /// /// private button enabled state./// private bool _isBtnEnabled = true;/// /// Button enabled state./// public bool IsBtnEnabled{get{return _isBtnEnabled;}set{_isBtnEnabled = value;OnPropertyChanged();}}

先定义一个内部私有属性,然后定义一个public属性,通过get,set获取私有类。设置属性值时调用“OnPropertyChanged()”方法通知界面刷新数据。

3.3 绑定列表

        /// /// private subitem list./// private ObservableCollection _subitemList = new ObservableCollection();/// /// Subitem list./// public ObservableCollection SubitemList{get{return _subitemList;}set{_subitemList = value;OnPropertyChanged();}}

绑定列表时一般使用ObservableCollection类实现,以便数据更新和刷新。

当然,如果不需要数据实时刷新时,可以直接绑定DataTable或者List等数据源。

3.4 绑定事件

绑定事件需要继承ICommand类,通过ICommand实现事件。

    /// /// Base command class./// /// 通过事件委托,以便跨线程调用public class BaseCommand : ICommand{/// /// Event handler/// 事件出发时先调用CanExecute(),然后调用/// public event EventHandler CanExecuteChanged;/// /// Execute action./// public Action DoExecute { get; set; }/// /// Canexecute method./// public Func DoCanExecute { get; set; } = new Func(obj => true);/// /// Can execute./// /// /// public bool CanExecute(object parameter){//初始化时会调用一次return DoCanExecute?.Invoke(parameter) == true;}/// /// Excute./// /// public void Execute(object parameter){//实例化委托。DoExecute?.Invoke(parameter);}/// /// 执行委托,调用CanExecute。/// public void DoCanExecuteChanged(){CanExecuteChanged?.Invoke(this, EventArgs.Empty);}} 

ICommand接头实例化时会先调用一次CanExecuteChanged,然后出发方法后先调用一次CanExecuteChanged,然后调用Execute类。

该BaseCommand类实现两个方法,然后将事件通过委托外传,ViewMode可以为具体事件绑定不同的方法。

        /// /// 构造函数/// public AddSubItemViewModel(){//Relate to export data method.ExportDataCommand = new BaseCommand(){DoExecute = new Action(ExportData)};}/// /// Export data./// /// public void ExportData(object obj){IsBtnEnabled = false;FileIO.ExportData();} 

先实现指令类,然后再构造函数中管理具体的实现方法,再在函数中调用具体的处理函数。

4. Model

Model类是一个个具体处理的类,包括各种处理函数等实体类,通过ViewModel进行调用。

相关内容

热门资讯

随笔作文 随笔作文随笔我不知道梦想是什么颜色,也许它自有自己的颜色,我不知道风往哪里吹,也许它自有自己的方向,...
曾经那个少年作文 曾经那个少年作文(精选22篇)  在现实生活或工作学习中,大家都跟作文打过交道吧,通过作文可以把我们...
垃圾分类的重要性优秀作文40... 垃圾分类的重要性优秀作文400字  我是一个垃圾桶,整天在角落收垃圾,一天到晚都挺着一个“啤酒肚”,...
我最爱看的电视栏目250字作... 我最爱看的电视栏目250字作文我最爱看的电视栏目是少儿频道的《熊出没》。原因:因为这部动画片很好玩,...
爱玩乐器的爸爸作文 爱玩乐器的爸爸作文爱玩乐器的爸爸··· 韩鹦我的爸爸是一个非常喜欢音乐的人,他特别擅长吹、拉、弹各种...
让我再看你一眼作文 让我再看你一眼作文  在日常学习、工作抑或是生活中,许多人都有过写作文的经历,对作文都不陌生吧,借助...
20年后的世界想象作文 20年后的世界想象作文  在日常的学习、工作、生活中,大家对作文都再熟悉不过了吧,写作文可以锻炼我们...
雨优秀作文 【荐】雨优秀作文  在日常学习、工作和生活中,大家都经常看到作文的身影吧,作文根据写作时限的不同可以...
春天作文 关于春天作文(通用15篇)  在日复一日的学习、工作或生活中,大家总少不了接触作文吧,作文是一种言语...
给老师“画像”_我的老师作文... 给老师“画像”_我的老师作文600字  无论是在学校还是在社会中,许多人都有过写作文的经历,对作文都...
我喜欢的水果西瓜作文 我喜欢的水果西瓜作文我喜欢的水果西瓜我最喜欢的水果就是西瓜了。今天正好是星期天,我的奶奶到市场去给我...
秋收的作文600字 秋收的作文600字(精选32篇)  在日常学习、工作或生活中,大家都不可避免地会接触到作文吧,作文是...
蛇作文 蛇作文大家一听到蛇,想蛇全有毒,有些人并不这样认为,因为蛇分为两种,一种是有毒蛇,另一种是无毒蛇。有...
取长补短作文450字 取长补短作文450字  一天,我像往常一样带着小狗花花和小猫京京去宠物食品店买东西。我给小猫京京买了...
走进图书馆作文800字 走进图书馆作文800字(通用7篇)  在日常学习、工作或生活中,大家都接触过作文吧,作文根据写作时限...
感动常在作文 感动常在作文通用15篇  在平时的学习、工作或生活中,大家都写过作文吧,作文是从内部言语向外部言语的...
用善良做底色作文650字 用善良做底色作文650字  繁华的街道上人来人往,正在举行商品优惠的店铺,被围了个水泄不通。  一只...
尊重的作文600字 关于尊重的作文600字(通用30篇)  在平凡的学习、工作、生活中,大家都尝试过写作文吧,作文是人们...
介绍一种物品作文 介绍一种物品作文15篇  在日常的学习、工作、生活中,大家都接触过作文吧,写作文可以锻炼我们的独处习...
救救我吧优秀作文 救救我吧优秀作文  很久以前,我是一条清澈见底的小河,在永中一小的门前缓缓流过。那时候,鱼虾在我的怀...