文章目录[隐藏]

易风软件库2月5日消息,基于WPF开发界面的一个很大劣势是可以方便地基于MVVM设计形式开发使用。本文从使用的角度基于MVVM完成参数化管材的创立界面。

1 MVVM
MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型。网上有若干对MVVM的引见,本文在此不做过多的赘述,本文将从详细的是使用案例让你们来领会MVVM的劣势,即完成UI局部的代码与中心业务逻辑、数据模型别离,到达高耦合低内聚的软件架构目的。

2 界面设计
我们希望翻开一个对话框,在其中可以显示管材模型;修正管材的参数可以实时看到管材外形的变化。如下图所示:

其中管子的外径由管子的内径加上管子壁厚,不需求用户输出。
当然也可以完成用户修正外径,减掉管壁来失掉内径。这个可以依据业务需求来调整。

3 程序设计
基于MVVM设计形式,我们完成这样的类设计:

其中:

AddSectionBarDlg
基于XAML完成的UI布局相关代码,即View层;

SectionBarVM
完成ViewModel层,即View和Model的桥梁,业务逻辑检测,比方半径不能小于0,壁厚不能小于0等。

ShapeElement
基于AnyCAD的数据存储类ShapeElement完成Model层。

4 程序完成
我们采用自底向上的完成顺序,逐渐完成Model、ViewModel和View。

4.1 Model完成
由于是基于AnyCAD内置的组件,可以间接略过。

ShapeElement 可以用来保管TopoShape对象外,可以保管用户自定义的参数。比方管材的长度、内径、厚度等。重点关注以下办法:

//设置参数 void SetParameter (String name, ParameterValue val); //查找参数 ParameterValue FindParameter (String name);
4.2 ViewModel完成
4.2.1 更新界面的才能
SectionBarVM从INotifyPropertyChanged承继,取得PropertyChanged的才能,即告诉View层说:
“嗨,兄万三,该更新界面啦!"

4.2.2 更新数据才能
基于属性机制完成。当内部更新,会调用属性set办法的时分,对数据实行合法检测。
若契合要求,更新Model,并调用OnPropertyChanged发起告诉。

//SectionBarVM.cs private ShapeElement mModel; public SectionBarVM(ShapeElement model) { mModel = model; } public static string NAME = "Name"; public string Name { get { return mModel.GetName(); } set { if(value != "") { mModel.SetName(value); OnPropertyChanged(NAME); } else { throw new ArgumentException("称号不能为空。"); } } }
尺寸参数属性完成:

rameterCreator.Create(value)); OnPropertyChanged(LENGTH); } else { throw new ArgumentException("长度太小。"); } } }
这里需求留意的是OutterRadius的完成。由于OutterRadius依赖了InnerRadius和Thickness属性,当被依赖的属性修正后,也需求触发依赖属性的音讯。否则界面OutterRadius的值不会再更新。

4.3 View完成
4.3.1 界面布局
添加一个窗口AddSectionBarDlg.xaml,依照设计要求实行布局。

数据双向绑定
Path="InnerRadius"将会跟SectionBarVM的InnerRadius绑定。当UI修正的时分会调用InnerRadius set; 当界面初始化和数据更新的时分,UI会调用InnerRadius get。

<Binding.ValidationRules>
数据单向绑定
Mode="OneWay" 表示UI只会从ViewModel获取数据。

4.3.2 View与ViewModel绑定
把ViewModel对象设置给Window的DataContext属性,即可完成UI与ViewModel的关联。

另外我们希望更改数据后也能更新三维窗口,在这里我们先用比拟笨的方法完成,即硬编码完成参数与三维模型的联动。详见SbVM_PropertyChanged办法的完成。

5 功用集成
暂时在草图项目中添加一个按钮,可以调用对话框:

case "pipeTube": { //暂时创立一个对象 var se = new ShapeElement(); se.SetName("管子"); var dlg = new AddSectionBarDlg(new SectionBarVM(se)); dlg.ShowDialog(); }
运转效果:

总结:

从完成代码的构造来看,运用MVVM设计形式的确可以让代码层次更清楚,界面类不再臃肿不堪。Microsoft设计XAML之初的一个目的是希望做UI布局的UX与写代码逻辑的开发可以分工协作,甚至为此开发了独立的设计工具Blend给UX运用,以让开发可以间接重用UX完成的XAML……
虽然理想并没有想象的那么美妙,但基于MVVM形式的确可以完成界面布局和中心业务逻辑别离,甚至把不同层的功用分给不同程度的程序员来完成。

更多行业知识、软件引荐、功能比照、工具测评请关注易风软件库。每天给大家带来更高效的企业服务软件,其中包括有微信,惠易购,赞聊,淘米购,叮咚盲盒,青蛙易购,支付宝,香蕉赶集,乐享购,淘盟铺,亲聊,探聊,诚智通,伶信,QQ,新易选,红包辅助,享乐好物,易民购,梦幻盲盒,苹果微信多开,微信分身,安卓微信多开,淘客购,旗语,点约,优品铺,创信等现如今热门社交软件,其中功能有秒抢,避雷,埋雷软件,扫尾,单透软件等一些红包强项外挂功能软件免费下载使用!