【干货】个人工作文档节选: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# winform 代码生成
http://www.cnblogs.com/luomingui/archive/2012/09/02/2667217.html 双鱼林: http://www.crsky.com/soft/4941 ...
- Linux下安装软件的一般步骤
目录 一.解析Linux应用软件安装包 二.了解包里的内容 三.搞定使用tar打包的应用软件 四.搞定使用rpm打包的应用软件 五.搞定使用deb打包的应用程序 一.解析Linux应用软件安装包(回目 ...
- 非官方windows下Cpython二进制扩展包下载地址
Unofficial Windows Binaries for Python Extension Packages url:http://www.lfd.uci.edu/~gohlke/pythonl ...
- 【转】JavaScript中,{}+{}等于多少?
原文链接:http://www.2ality.com/2012/01/object-plus-object.html 译文链接:http://www.cnblogs.com/ziyunfei/arch ...
- web cookie and session
一.什么是会话? 打开一个浏览器,访问多个网址后,再关掉浏览器,这一整个过程就是会话. 二.cookie技术 这是客户端保存临时数据的技术,主要用于保存用户的登录信息及其它需要保存的数据,如购买与结帐 ...
- NumberFormat usage
NumberFormat 是所有数值格式的抽象基类. 该类提供了格式化和分析数值的接口. NumberFormat 也提供了确定 哪个语言环境具有数值格式以及它们名字的方法. import java. ...
- 新浪微博SDK的使用
花了两天时间研究了一下新浪微博SDK,遇到了不少问题,有必要整理一下 1.首先下载下weiboSdk,导入weiboSDKD和weiboSDKDemo两个项目,这时发现导入的weiboSDKDemo项 ...
- hexo框架-next主题-github搭建个人博客
IT`huhui 的前言录 我在GITHUB的个人站点:http://ithuhui.cn 这里遇到的很多问题都是亲身解决后写的.还有遇到不懂可以邮件M我 在这里要感谢浮生志的博客教程,很多我一开始不 ...
- SQLSERVER性能监控级别步骤
SQLSERVER性能监控级别步骤 下面先用一幅图描述一下有哪些步骤和顺序 1.识别瓶颈 识别瓶颈的原因包括多个方面,例如,资源不足,需要添加或升级硬件: 工作负荷在同类资源之间分布不均匀,例如,一个 ...
- js 弹出窗口 防止拦截,突破阻止,保存后打开
<script language="javascript"> function orderprint() { var formUrl = "savedata_ ...