【干货】个人工作文档节选: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 ...
随机推荐
- vsftpd移植
1.交叉编译 2.将生成的 vsftpd 复制到目标板 /usr/sbin 目录,vsftpd.conf 复制到目标板 /etc 目录,并添加 vsftpd 为可执行: 3.配置 使用 vi 打开 v ...
- css之字体设置
字体大小font-size 字体风格font-style 字体加粗font-weight 字体类型font-family 字体阴影text-shadow 字体行高line-height 字间距lett ...
- 2748: [HAOI2012]音量调节
Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...
- JAVA动态加载JAR包执行程序
入口代码 import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.ne ...
- iOS 设置navigationBar背景
- (void)viewWillAppear:(BOOL)animated { [superviewWillAppear:animated]; [self.navigationContro ...
- C++二级指针第三种内存模型
#include "stdio.h" #include "stdlib.h" #include "string.h" void main() ...
- Webpack使用教程一
过去数年间,web开发已经从包含少量JavaScript代码的应用发展到到拥有复杂JavaScript代码和代码之间依赖关系树的应用.手动维护这些复杂的代码依赖关系是很麻烦的.Webpack能分析项目 ...
- jquery 编码解码
中文转Unicode:HttpUtility.UrlEncodeUnicode(string str); 转换后中文格式:"%uxxxx" 举例:"柳_abc123&qu ...
- ASP.NET MVC学习之视图篇(2)
继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...
- Scrum 是什么?
Scrum 是什么? Scrum 是当前最流行的敏捷软件开发方法论和实施框架.但就像人们对 “Agile” 术语的不同理解一样,不同的人对 “Scrum” 也有着不同的理解.那么,到底 Scrum 是 ...