在ViewModel內,會有大量重複性的在Property set中激發 INotifyPropertyChanged.PropertyChanged 事件的代碼。 這種屬性用已有的代碼片斷已經很難高效的輸入。使用合適的代碼片斷在VM設計時 不會由於過於機械的修改影響設計思路express
在項目模板中加入對應的code snippet框架
Sample:async
鍵入 propvm [Tab] [Tab]後 產生以下代碼ide
private int _PropertyName; public int PropertyName {
get { return _PropertyName; } set { _PropertyName=value; RaisePropertyChanged(()=>PropertyName); } }
一樣做爲Command<Object> 的屬性 也須要相似的code snippets函數
Sample:優化
鍵入 propcmd[Tab] [Tab]後 產生以下代碼ui
private Command<Object> _CommandName= new Command<Object> ( p=>{}, p=>true); public Command< Object > CommandName { get { return _CommandName; } set { _CommandName =value; RaisePropertyChanged(()=>CommandName); } }
做爲MVVM的UI開發設計基礎,一個生產力足夠高的框架應當可以爲設計時提供VM的結構成員和設計時數據支持。spa
假設咱們有一個ViewModel 類型爲 My.Project.TestViewModel設計
在設計器正確引入以下命名空間時code
<UserControl … </UserControl>
|
在設計器根節點加入
<d:FrameworkElement.DataContext> </d:FrameworkElement.DataContext>
|
這時設計器會爲View指定一個TestViewModel的新實例,此時綁定會用這個新實例爲模板進行設計時支持,好比所見即所得的綁定結果顯示,以及模板設計支持。
對於早期版本的 VS,或者WPF/SL 之外不能支持 blend設計時命名空間的平臺,d:DataContext 不被設計時支持, 這時候咱們可能須要直接使用 <FrameworkElement.DataContext> 標記。這樣作的代價多是額外產生一個 ViewModel 對象引用。 若是咱們可以控制好 ViewModel 默認構造函數中調用的資源,這樣作問題並不大,不失爲一種辦法。
因爲設計時設計器會建立一個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 這些方面作的都很不錯。