2009-08-28 91 views
4

在ViewModel中爲C#WPF中的數據綁定定義屬性有一個簡潔的方法嗎?下面的屬性定義非常詳細,特別是當有大量的屬性:在C#WPF中定義MVVM數據綁定屬性的簡潔方法

private bool mSomeProperty; 

public bool SomeProperty 
{ 
    get { return this.mSomeProperty; } 
    set 
    { 
     if (value != this.mSomeProperty) 
     { 
      this.mSomeProperty = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("SomeProperty")); 
     } 
    } 
} 

回答

3

在C#中,我喜歡做一個基類,並把一些輔助方法就可以了。然後我讓ViewModel從它下降。這是從內存,但它是這樣的:

public class Observable : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void SetProperty<T>(ref T backingField, T newValue, 
     string propertyName) 
    { 
     if (Equals(backingField, newValue)) 
      return; 
     backingField = newValue; 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, 
       new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

而且,在用法:

public class MyClass : Observable 
{ 
    private bool m_someProperty; 

    public bool SomeProperty 
    { 
     get { return m_someProperty; } 
     set { SetProperty(ref m_someProperty, value, "SomeProperty"); } 
    } 
} 
+0

的使用這實際上是相同的一個解決方案,我已經實現,但仍覺得笨重給我。這是朝正確方向邁出的一步。 – 2009-08-28 17:23:50

+0

@emddudley - 實際上,他在基類中實現INotifyPropertyChanged的方法相對於您的問題中的代碼是一個非常重要的改進。如果您使用您的代碼並嘗試創建派生類,則無法從派生類中引發基類的事件。你幾乎必須在你的基類中創建一個NotifyPropertyChanged()方法來實現這個功能。 – 2009-08-31 12:04:08

0

如果您使用的是德爾福棱鏡語言(基於帕斯卡-NET語言),你只需要添加的notify關鍵字,以及編譯器自動實現INotifyPropertyChanged和寫入所有的樣板代碼爲您提供:

property SomeProperty: bool; notify; 
0

我想你不會得到財產申報相比要小得多,至少不是「正常」的方式。你可以使用城堡攔截器來照顧事件的raisal。

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChanged; 
    public void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(propertyName); 
    } 

    public virtual string MyProperty { get; set; } 
    public virtual string MyProperty2 { get; set; } 
} 

攔截器將需要觸發屬性更改事件:

public class PropertyChangedInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     //Pseudo code 
     if (invocation.Method is Property Setter) 
     { 
      Call FirePropertyChanged of invocation.InvocationTarget ; 
     } 
    } 
} 

你只需要確保您的視圖模型的屬性是虛擬的,你的視圖模型始終是一個代理,而不是視圖模型本身。

問候

1

你總是可以使用DependencyProperties和propdp你的心臟了......

+2

我不會在ViewModel中使用DependencyProperties。有關更多信息,請參閱http://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel。 – jbe 2009-08-29 09:50:54

+0

它真的取決於你。您鏈接的帖子沒有給出任何不使用DP的好理由,除了它們比POCO更重。除非你真的遇到問題,否則過早地優化它們是不成熟的優化。我現在正在開發的一個項目有大約40個VM和M,所有這些都擴展了DP,而且我沒有注意到應用程序運行緩慢。 – Will 2009-08-29 19:37:08

0

你可以考慮這將允許你裝飾屬性(你可以重新定義爲一個自動屬性),並向setter注入觸發NotifyPropertyChanged事件的行。一個額外的好處是你擺脫了與屬性名稱相同的字符串。

這並不理想,因爲您需要該工具,如果您稍後查看代碼,它不會立即顯而易見,但它絕對使它更加整潔。

我希望MSFT會爲C#4添加這樣的屬性,但我想我們必須等待C#5。