【乾貨】我的工做文檔節選:XAML MVVM 框架易用性細節優化Tips

1    易用性細節優化

1.1 代碼片斷

在ViewModel內,會有大量重複性的在Property set中激發 INotifyPropertyChanged.PropertyChanged 事件的代碼。 這種屬性用已有的代碼片斷已經很難高效的輸入。使用合適的代碼片斷在VM設計時 不會由於過於機械的修改影響設計思路express

1.1.1  Property Code Snippets

在項目模板中加入對應的code snippet框架

Sample:async

鍵入 propvm [Tab]  [Tab]後 產生以下代碼ide

     

  
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]後 產生以下代碼ui

 

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的結構成員和設計時數據支持。spa

 

1.2.1  步驟:在設計視圖添加設計時VM.

假設咱們有一個ViewModel 類型爲  My.Project.TestViewModel設計

在設計器正確引入以下命名空間時code

             

   
   

<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 這些方面作的都很不錯。

相關文章
相關標籤/搜索