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
    xmlns:d=”http://schemas.microsoft.com/expression/blend/2008”
    xmlns:vm=”clr-namespace:My.Project”
    …>

</UserControl>

在设计器根节点加入

<d:FrameworkElement.DataContext>
        <vm:TestViewModel />

</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的更多相关文章

  1. Oracle-在线重定义操作文档

    Oracle-在线重定义操作文档 2015年10月8日 15:51 在线重定义的大致操作流程如下: (1)创建基础表A,如果存在,就不需要操作. (2)创建临时的分区表B. (3)开始重定义,将基表A ...

  2. MongoDB(五):MongoDB操作文档

    本篇文章中将讲解如何使用MongoDB操作文档. 文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式.BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary ...

  3. xaml mvvm(1)之结构

    在微软winstore.wp和silverlight中xaml是用来构建UI视图的标记语言,全名Extensible Application Markup Language.在结构上类似于html,但 ...

  4. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

  5. .NET Core 3 WPF MVVM框架 Prism系列之导航系统

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism基于区域Region的导航系统 在讲解Prism导航系统之前,我们先来看看一个例子,我在之前的demo项目创建一个登录界面: 我们看 ...

  6. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  7. “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...

  8. 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质

    最近前端圈子里面,发现大家都在热炒概念,什么knockout,angularJs,都被捧成神了,鄙人不才,最近心情也不好,特地写这篇文章来找骂 写代码的码农都知道,Java社区虽然不是一个提出分层思想 ...

  9. 迷你MVVM框架 avalonjs 入门教程

    新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...

随机推荐

  1. c#开发Mongo笔记第七篇

    开发到这里遇到了一些问题,哪到这里想请教一下大家 今天我完成的是菜单功能, public class Menu { public ObjectId _id { get; set; } public i ...

  2. ActiveX控件dsoFramer的使用(word、excel、PPT)

    dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.国内很多著名的OA中间件,电子印章,签名留痕等大多数是依此改进而来的. 一 ...

  3. [Linux]服务管理:rpm包, 源码包

    --------------------------------------------------------------------------------------------------- ...

  4. php 中文正则

    utf8编码中文 preg_match("/^[\x{4e00}-\x{9fa5}]+$/u") 而不是 "/^[\x4e00-\x9fa5]+$/u"

  5. Response、Request、QueryString,repeater添加,修改,删除数据

    内置对象: Response对象:响应请求,Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应.Response.Write("<script>a ...

  6. CSS3中:nth-child和:nth-of-type的区别深入理解

    关于:nth-child和:nth-of-type的区别之前一直没太注意.最近打算深入了解一些CSS3,才发现里面其实暗藏玄机. :nth-child可以选择父元素下的字元素,:nth-of-type ...

  7. python基础语法(3)

    七.面向对象编程 python支持面向对象编程:类和对象是面向对象编程的两个主要方面,类创建一个新的类型,对象是这个类的实例. 对象可以使用普通的属于对象的变量存储数据,属于对象或类的变量被称为域:对 ...

  8. ubuntu 14.04加入五笔输入法

    快捷键"ctrl+AIt+T",弹出终端,输入以下指令 //先卸载IBUS输入法 killall ibus-daemon sudo apt- get purge ibus ibus ...

  9. FastReport代码计算高度

    Dim iHeight As Double        Dim columnData_form As DataSourceBase             iHeight=Page1.TopMarg ...

  10. XproerIM产品使用手册

      1.  产品介绍 版权所有:(c)2009-2016 荆门泽优软件有限公司 保留所有权利. 产品官网:http://www.ncmem.com/apps/xproerim/index.asp 安装 ...