2011-06-19 24 views
2

閱讀完this後,我很確定如何將一個類的屬性綁定到我的UserControl中的TextBox。我仍然很不舒服地通過字符串訪問屬性。任何與該屬性的類型或存在(雙方)的連接都將丟失。
我用這種態度主要問題是:C#中的數據綁定 - 作爲字符串的屬性名稱

  • 智能感知停止工作 - >容易犯一個錯誤,不太方便;
  • 無論是寫有將不檢查,直到它被稱爲 - >錯誤很可能保持不被注意,直到最糟糕的時刻...

有一些其他的方法來創建一個用戶控件代表一個類連接到該類的一個實例並保持與其同步? (除了與事件做手工)

回答

0

(除了與事件做手工)

必須澄清的是一個和雙向數據綁定確實依賴於事件。請閱讀大約How to: Implement Property Change Notification

也就是說,您可以在代碼中不使用代表屬性名稱的硬編碼字符串進行數據綁定。

一種方法是通過自定義屬性。您可以修飾要讓用戶控件綁定到的數據模型中的某些屬性。當DataSource在您的用戶控制設置這種方式,通過反射,你可以自定義Attribute裝飾性和綁定的DataSource對象搜索對他們說:

public class MyDataModelObject 
{ 
    public int NotBindableProperty { get; } 

    [MyBindableAttribute] 
    public string BindableStringProperty 
    { 
     get {...} 
     set {...} 
    } 
} 
0

沒有理由你不得不使用字符串,這是隻是基本的NotifyPropertyChanged事件機制。例如,Prism Framework提供了一個簡單的包裝,它將Linq`Expression>作爲參數,並使用反射來獲取屬性名稱(但請注意;在一個實例中,如果在屬性上使用在短時間內更新多次)。

你可以很容易地編寫一個包裝這樣的自己,而無需使用整個棱鏡框架,像這樣:

class NotificationObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    protected virtual void OnPropertyChanged(ProeprtyChangedEventArgs e) 
    { 
     PropertyChanged(this, e); 
    } 

    protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression) 
    { 
     // you'll want to add some error checking here 
     var name = ((MemberExpression)propertyExpression).Member.Name; 
     OnPropertyChanged(new PropertyChangedEventArgs(name)); 
    } 
} 

現在,你可以通過傳遞在屬性中使用它:

class Whatever : NotificationObject 
{ 
    private string _foo = String.Empty; 
    public string Foo 
    { 
     get { return _foo ?? String.Empty; } 
     set 
     { 
      if(!_foo.Equals(value)) 
      { 
       _foo = value; 
       RaisePropertyChanged(this.Foo); 
      } 
     } 
    } 
} 

現在,如果您曾經重構過屬性Foo,那麼您不必擔心更新字符串。但這並不能解決另一方面的問題。一個DependencyProperty可以,但是你在內部有字符串問題,哪個IMP更好,因爲它只是在一個地方(在類中)的複製,而不是外部複製的數量n。這並不完美,但它有幫助。

0

你也可以檢查這個項目notifypropertyweaver它可以幫助你避免魔法字符串,並提供一些更酷的東西。

相關問題