【乾貨】個人工作文件節選: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
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/
【bzoj3289】Mato的文件管理 離散化+莫隊算法+樹狀數組
逆序對 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”應用程序中的服務器錯誤。 -------------------------------------------------------------------------------- 未能加載文
【IO】01、文件對象
文件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寫的,工具效果不錯,所以打算在公司內部推廣。為了防止代碼泄露就
【Linux】【二】linux 壓縮文件(txt)、查看壓縮文件內容、解壓縮文件、
str tool div png gun medium spa clas info 通過Xshell 壓縮文件、解壓縮文件 gzip tools.txt 壓縮【tools.txt】文件 zcat tools.txt.gz 查看壓縮文件
【ElasticSearch】ElasticSearch-SQL插件
學習 git 數據 tails sql https tip wiki agg ElasticSearch-SQL插件 image2017-10-27_11-10-53.png (1067×738)elastic SQL_百度搜索Druid SQL 解析器的解析過程 -