【干货】个人工作文档节选:XAML MVVM 框架易用性细节优化Tips
1 易用性细节优化
1.1 代码片段
在ViewModel内,会有大量重复性的在Property set中激发 INotifyPropertyChanged.PropertyChanged 事件的代码。 这种属性用已有的代码片段已经很难高效的输入。使用合适的代码片段在VM设计时 不会因为过于机械的修改影响设计思路
1.1.1 Property Code Snippets
在项目模板中加入对应的code snippet
Sample:
键入 propvm [Tab] [Tab]后 产生如下代码
private int _PropertyName;
public int PropertyName
{
get
{
return _PropertyName;
}
set
{
_PropertyName=value;
RaisePropertyChanged(()=>PropertyName);
} }
1.1.2 Command Code Snippets
同样作为Command<Object> 的属性 也需要类似的code snippets
Sample:
键入 propcmd[Tab] [Tab]后 产生如下代码
private Command<Object> _CommandName=
new Command<Object> (
p=>{},
p=>true); public Command< Object > CommandName
{
get
{
return _CommandName;
}
set
{
_CommandName =value;
RaisePropertyChanged(()=>CommandName);
} }
1.2 设计时支持
作为MVVM的UI开发设计基础,一个生产力足够高的框架应当能够为设计时提供VM的结构成员和设计时数据支持。
1.2.1 步骤:在设计视图添加设计时VM.
假设我们有一个ViewModel 类型为 My.Project.TestViewModel
在设计器正确引入如下命名空间时
|
<UserControl … </UserControl> |
在设计器根节点加入
|
<d:FrameworkElement.DataContext> </d:FrameworkElement.DataContext> |
这时设计器会为View指定一个TestViewModel的新实例,此时绑定会用这个新实例为模板进行设计时支持,比如所见即所得的绑定结果显示,以及模板设计支持。
对于早期版本的 VS,或者WPF/SL 以外不能支持 blend设计时命名空间的平台,d:DataContext 不被设计时支持, 这时候我们可能需要直接使用 <FrameworkElement.DataContext> 标记。这样做的代价可能是额外产生一个 ViewModel 对象引用。 如果我们能够控制好 ViewModel 默认构造函数中调用的资源,这样做问题并不大,不失为一种办法。
1.2.2 步骤:在VM添加设计时数据与逻辑
由于设计时设计器会创建一个VM实例来帮助设计,VM的设计需要注意以下几点
l VM要具有默认构造函数,否则设计器无法将其实例化
l VM中的逻辑要能够判断当前运行环境是否在设计时
n 使用大量珍贵资源的逻辑在设计时不允许运行,比如
u Timer 逻辑
u IO操作
应当在适当位置添加 “IsInDesignMode” 静态属性,建议在 ViewModelBase中添加。
static bool? _IsInDesignMode;
/// <summary>
/// <para>Gets if the code is running in design time. </para>
/// <para>读取目前是否在设计时状态。</para>
/// </summary>
public static bool IsInDesignMode
{
get
{
return (
_IsInDesignMode
??
(
_IsInDesignMode =
#if SILVERLIGHT_5||WINDOWS_PHONE_8||WINDOWS_PHONE_7
DesignerProperties.IsInDesignTool
#elif NETFX_CORE
Windows.ApplicationModel.DesignMode.DesignModeEnabled
#else
(bool)System.ComponentModel.DependencyPropertyDescriptor
.FromProperty(
DesignerProperties.IsInDesignModeProperty,
typeof(System.Windows.FrameworkElement))
.Metadata
.DefaultValue
#endif
))
.Value;
}
}
在实现了这个属性之后 在具体Vm的构造函数或Onload事件中用户就可以添加伪数据,也可以避免不能再设计时调用的功能被调用
比如下面这段代码
protected override async Task OnBindedViewLoad(MVVMSidekick.Views.IView view)
{
await base.OnBindedViewLoad(view); if (IsInDesignMode)
{
HelloWorld = "Hello Mvvm world, Design mode sample";
}
else
{
if (Id == null)
{
Id = Guid.NewGuid().ToString();
} GetValueContainer(x => x.CountDown).GetNullObservable()
.Subscribe(
_ =>
{
HelloWorld = string.Format("Loading {0}", CountDown);
}
);
} }
当然, MVVM-Sidekick 这些方面做的都很不错。
【干货】个人工作文档节选:XAML MVVM 框架易用性细节优化Tips的更多相关文章
- Oracle-在线重定义操作文档
Oracle-在线重定义操作文档 2015年10月8日 15:51 在线重定义的大致操作流程如下: (1)创建基础表A,如果存在,就不需要操作. (2)创建临时的分区表B. (3)开始重定义,将基表A ...
- MongoDB(五):MongoDB操作文档
本篇文章中将讲解如何使用MongoDB操作文档. 文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式.BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary ...
- xaml mvvm(1)之结构
在微软winstore.wp和silverlight中xaml是用来构建UI视图的标记语言,全名Extensible Application Markup Language.在结构上类似于html,但 ...
- ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet
Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...
- .NET Core 3 WPF MVVM框架 Prism系列之导航系统
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism基于区域Region的导航系统 在讲解Prism导航系统之前,我们先来看看一个例子,我在之前的demo项目创建一个登录界面: 我们看 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...
- 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质
最近前端圈子里面,发现大家都在热炒概念,什么knockout,angularJs,都被捧成神了,鄙人不才,最近心情也不好,特地写这篇文章来找骂 写代码的码农都知道,Java社区虽然不是一个提出分层思想 ...
- 迷你MVVM框架 avalonjs 入门教程
新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...
随机推荐
- c#开发Mongo笔记第七篇
开发到这里遇到了一些问题,哪到这里想请教一下大家 今天我完成的是菜单功能, public class Menu { public ObjectId _id { get; set; } public i ...
- ActiveX控件dsoFramer的使用(word、excel、PPT)
dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.国内很多著名的OA中间件,电子印章,签名留痕等大多数是依此改进而来的. 一 ...
- [Linux]服务管理:rpm包, 源码包
--------------------------------------------------------------------------------------------------- ...
- php 中文正则
utf8编码中文 preg_match("/^[\x{4e00}-\x{9fa5}]+$/u") 而不是 "/^[\x4e00-\x9fa5]+$/u"
- Response、Request、QueryString,repeater添加,修改,删除数据
内置对象: Response对象:响应请求,Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应.Response.Write("<script>a ...
- CSS3中:nth-child和:nth-of-type的区别深入理解
关于:nth-child和:nth-of-type的区别之前一直没太注意.最近打算深入了解一些CSS3,才发现里面其实暗藏玄机. :nth-child可以选择父元素下的字元素,:nth-of-type ...
- python基础语法(3)
七.面向对象编程 python支持面向对象编程:类和对象是面向对象编程的两个主要方面,类创建一个新的类型,对象是这个类的实例. 对象可以使用普通的属于对象的变量存储数据,属于对象或类的变量被称为域:对 ...
- ubuntu 14.04加入五笔输入法
快捷键"ctrl+AIt+T",弹出终端,输入以下指令 //先卸载IBUS输入法 killall ibus-daemon sudo apt- get purge ibus ibus ...
- FastReport代码计算高度
Dim iHeight As Double Dim columnData_form As DataSourceBase iHeight=Page1.TopMarg ...
- XproerIM产品使用手册
1. 产品介绍 版权所有:(c)2009-2016 荆门泽优软件有限公司 保留所有权利. 产品官网:http://www.ncmem.com/apps/xproerim/index.asp 安装 ...