我正在尝试将Label的'Content'属性绑定到我拥有的某个自定义类型的属性;不幸的是,我没弄明白该怎么做,这就是我在这里的原因:)。
假设我有以下类型(可以在与包含Label或不同命名空间的WPF窗口相同的命名空间中):
namespace MyNS
{
public class Person
{
private int age = 0;
public int Age
{
get { return age; }
}
public void GetOlder
{
age++;
}
}
}
如何将我的Label绑定到'Age'属性?
在运行时,我将创建一个'Person'实例;我想确保我的Label绑定到正确的实例;即如果我打电话:
Person SomePerson = new Person();
SomePerson.GetOlder();
我希望我的Lable能够为'SomePerson'获得'Age'属性的新价值。
如果我在不同的线程中调用'GetOlder'(无论是使用Dispatcher线程还是BackgroundWorker)怎么办?我还能获得'Age'的最新价值吗?或者我是否还需要处理其他一些事情以使这种情况成为可能?
提前致谢,
TheBlueSky
答案 0 :(得分:1)
事实证明这是一种直截了当的事情,我想知道为什么没有人回答:)无论如何,这里有答案:
首先我们需要像这样创建Person类:
using System.ComponentModel;
namespace MyNS
{
public 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++;
}
}
}
然后我们将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值。
在多线程中,故事并没有什么不同;在不同的线程中调用p.GetOlder()时,它的工作方式相同:
new Thread(
new ThreadStart(
delegate() {
p.GetOlder();
}
)).Start();
希望这有帮助。
TheBlueSky