2010-05-21 116 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