【干货】个人工作文档节选: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#事务的使用
1.引入相应的命名空间 using System.Transactions; 2.代码事例(using (TransactionScope ts = new TransactionScope())) ...
- 远程桌面Default.rdp 中各个参数的含义(转)
存储在 Default.rdp 文件中的设置 默认情况下,将在“我的文档”文件夹中创建 Default.rdp 文件.以下 RDP 设置存储在 Desktop.rdp 文件中: desktopwidt ...
- 团队博客作业Week1
Study the projects done by previous student groups - View their blog site, use their software, email ...
- VS2010中使用GDAL(一)
初次使用visual studio 对工具不熟悉,有些步骤可以配置的 (1)在VS2005中新建win32控制台程序 testGDALconsole,(向导中附加选项不能选为空项目) 将C:\GDAL ...
- step by step 之餐饮管理系统三
1.说明 表名的长度最长为18个字符 茶色的字段为主键或联合主键 浅黄色的字段为索引 浅灰底色的字段为临时表中比正式表多出的字段 数据库系统:Sqlserver2008 脚本工具:使用CodeGene ...
- Windows 8.1 应用再出发 - 几种更新的控件
Windows 8.1 除了新增了很多很有用的控件外,还对一些控件做出了更新.接下来我们一起对这些更新的控件一一做出讲解. 1. FlipView 更新 翻转视图控件,在应用中常用作图片等内容的翻页/ ...
- struts框架学习过程中的问题
1,错误: java.lang.NullPointerException: Module 'null' not found.错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cla ...
- [Leetcode][JAVA] Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- 第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用
今天来了解下scala的泛型 先让我们看下这段代码 class Triple[F,S,T](val first:F,val second: S,val third: T) val triple = n ...
- Libgls 1.0.1 发布,OpenGL 立体渲染
Libgls 1.0.1 只是修复了一些小问题,更新了 FindGLS.cmake 脚本. Libgls 允许 OpenGL 立体渲染,不需要硬件支持四缓冲立体.支持许多立体显示模式,从立体眼镜的3D ...