绑定自定义类型属性的WPF控件
问题描述:
我试图将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)首先,我们需要创建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