2010-05-21 114 views
1

我試圖將Label的'Content'屬性綁定到某個自定義類型的屬性上;不幸的是,我不知道如何去做,這就是爲什麼我在這裏:)綁定自定義類型屬性的WPF控件

讓我們假設我有以下類型(可以在與我的WPF窗口包含標籤相同的命名空間或不同的命名空間):

namespace MyNS 
{ 
    pubic class Person 
    { 
     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
     } 

     public void GetOlder 
     { 
      age++; 
     } 
    } 
} 

1)如何將我的標籤綁定到'Age'屬性?

2)在運行時我將創建一個'Person'的實例;我想確保我的標籤綁定到正確的實例;即,如果我叫:

Person SomePerson = new Person(); 
SomePerson.GetOlder(); 

我希望我的標籤,可以有「年齡」屬性「SomePerson」的新值。 3)如果我在不同線程中調用'GetOlder'(無論使用Dispatcher線程還是BackgroundWorker),該怎麼辦?我還會得到'年齡'的最新值嗎?或者我還必須照顧其他一些事情,以使這種情況成爲可能?

由於提前,

TheBlueSky

回答

1

這竟然是一種簡單的事情,我不知道爲什麼沒有人回答了這個問題:)無論如何,這裏的答案:

1)首先,我們需要創建Person類是這樣的:

using System.ComponentModel; 

namespace MyNS 
{ 
    pubic class Person : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
      set 
      { 
       age = value; 
       OnPropertyChanged("Age"); 
      } 
     } 

     protected void OnPropertyChanged(string PropertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(PropertyName)); 
      } 
     } 

     public void GetOlder 
     { 
      Age++; 
     } 
    } 
} 

2)然後我們我們的WPF控件綁定到Person.Age屬性是這樣的:

using System.Windows.Data; 

//... 

Person p = new Person(); 
Binding ageBinding = new Binding("Age"); 
ageBinding.Source = p; 
MyWpfLabelControl.SetBinding(Label.ContentProperty, ageBinding); 

現在每當調用p.GetOlder()時,MyWpfLabelControl.Content將更改爲新的p.Age值。

3)在多線程中,故事沒有什麼不同;當在不同的線程中調用p.GetOlder()時,它將以相同的方式工作:

new Thread(
    new ThreadStart(
     delegate() { 
      p.GetOlder(); 
     } 
)).Start(); 

希望這會有所幫助。

TheBlueSky