1. 程式人生 > >【乾貨】個人工作文件節選:XAML MVVM 框架易用性細節優化Tips

【乾貨】個人工作文件節選: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
    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    易用性細節優化 1.1 程式碼片段 在ViewModel內,會有大量重複性的在Property set中激發 INotifyPropertyChanged.PropertyChanged 事件的程式碼。 這種屬性用已有的程式碼片段已經很難高效的輸入。使用合適的程式碼片段在VM設計時 不會因為過於

乾貨二十五深度學習相關公開資料集

https://www.analyticsvidhya.com/blog/2017/06/hands-on-with-deep-learning-solution-for-age-detection-practice-problem/

bzoj3289Mato的文管理 離散化+莫隊算法+樹狀數組

逆序對 sample 單位 oid 逆序 cmp family += efi 原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 題目描述 Mato同學從各路神犇以各種方式(你們懂的)收集了許多資料,這些資料一共有n份

BootStrap 布局組 I

包括 code put school radi 靈活 -- 標簽 上拉 BootStrap布局組件 I   除了在原生的HTML基礎上進行了外觀和類別上的改進,BS還包裝了很多組件進庫中,設計網頁時我們可以方便地調用這些組件。下面來簡略地介紹一下各種各樣的組件 ■

BootStrap 布局組 II

ssa text 關閉 art 一個 默認樣式 沒有 new 部分 BootStrap 布局組件 II ■  分頁   BS中通過.pagination的ul元素來實現一個分頁集合,一個典型的分頁如下: <ul class="pagination">

MongoDB配置文說明

details 5.0 key 第一個 pen log data 端口 this 啟動MongoDB有2種方式,一是直接指定配置參數,二是指定配置文件。這裏先介紹配置文件,啟動方式如下: mongod --config /etc/mongodb.conf 配置如下:ve

jQuery結合accordion插分析寫插的方法及註意事項

als 參數 啟動 trigger 默認值 cto global efi each 1.jQuery插件的命名方式:jquery.[插件名].js 2.對象方法附加在jQuery.fn上,全局函數附加在jQuery對象本身上 3.插件內部this指向的是通過選擇器獲取的jQ

未能加載文或程序集“XXX”或它的某一個依賴項。試圖加載格式不正確的程序。

平臺 文件 導致 啟用 方法 位置 一個 nbsp cpu “/xxxxx”應用程序中的服務器錯誤。 -------------------------------------------------------------------------------- 未能加載文

IO01、文對象

文件io一、打開和關閉文件1、文件打開和關閉In [1]: help(open) Help on built-in function open in module io: open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newl

原創datalist repeater 控的行鼠標單擊 以及 滑過特效

function weight list 控件 contain 搬家 seo com 5-0 原文發布時間為:2009-05-06 —— 來源於本人的百度文章 [由搬家工具導入]调用方法如:

LIUNX目錄或文權限,權限授予

技術分享 用戶組 style 擁有 image 文件 clas content root用戶 三個三個一組看: 1. 第一段表示文件所有者對此文件的操作權限 2. 第二段表示文件所有者所在組對些文件的操作權限 3. 第三段表示除上述兩種外的任何用戶/組對此文件的操作權限

C語言文操作詳解

pri void rfi 識別 archive format 隨機 stat 文本文 轉自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C語言中沒有輸入輸出語句,所有的輸入輸出功能都用

科普銷售管理軟的功能是什麽?

管理系統對於企業來說,贏得了客戶信賴,就預示著企業的成功,而企業面對眾多客戶,其中銷售管理軟件起到了很大的作用,能夠幫助企業實現快速管理跟進客戶、合同快速達成等,大大的提高了企業的辦公效率和效益,同時,對於企業來說,無規矩不成方圓,規範管理是企業的基礎,是向客戶提供更好服務的保障,而規範企業管理,這也是銷售管

java日誌組介紹(common-logging,log4j,slf4j,logback )

微秒 是把 輸出重定向 gin ons java 循環 框架 log4j.jar common-logging common-logging是apache提供的一個通用的日誌接口。用戶可以自由選擇第三方的日誌組件作為具體實現,像log4j,或者jdk自帶的lo

python讀取excel文

python#!/usr/bin/env python #-*- coding:utf-8 -*- #思路:就是先取出表頭,然後for循環(len(表頭數據長度)),以字典形式將表頭和數據一一插入數據庫 import xlrd def flask_OpenExcel(file=‘ceshi.xlsx‘):

Ansible 文檔譯文主機清單文

state 字符 ont lan 實現 self max 一個數 代理 Inventory 主機清單文件 Ansible 可以對你的基礎設施中多個主機系統同時進行操作。通過選擇在Ansible的inventory列出的一部分主機來實現。inventory默認保存在/etc/

Python讀取cvs文報錯UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 6: invalid start byte

spl 重慶 http posit nbsp div ack lin pan 現在有文件data.csv 文件編碼格式為:ANSI data.csv 1|1|1|北京市 2|1|2|天津市 3|1|3|上海市 4|1|4|重慶市 5|1|5|石家莊市 6|

類似py2exe軟真的能保護python源碼嗎

腳本 放心 icon 復雜 保存 壓縮文件 mpi nts 函數 類似py2exe軟件真的能保護python源碼嗎 背景 最近寫了個工具用於對項目中C/C++文件的字符串常量進行自動化加密處理,用python寫的,工具效果不錯,所以打算在公司內部推廣。為了防止代碼泄露就

Linuxlinux 壓縮文(txt)、查看壓縮文內容、解壓縮文

str tool div png gun medium spa clas info 通過Xshell 壓縮文件、解壓縮文件 gzip  tools.txt        壓縮【tools.txt】文件 zcat  tools.txt.gz       查看壓縮文件

ElasticSearchElasticSearch-SQL插

學習 git 數據 tails sql https tip wiki agg ElasticSearch-SQL插件 image2017-10-27_11-10-53.png (1067×738)elastic SQL_百度搜索Druid SQL 解析器的解析過程 -