使用自定义类型的属性绑定WPF控件

时间:2010-05-21 07:37:35

标签: c# binding

我正在尝试将Label的'Content'属性绑定到我拥有的某个自定义类型的属性;不幸的是,我没弄明白该怎么做,这就是我在这里的原因:)。

假设我有以下类型(可以在与包含Label或不同命名空间的WPF窗口相同的命名空间中):

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

        public int Age
        {
            get { return age; }
        }

        public void GetOlder
        {
            age++;
        }
    }
}
  1. 如何将我的Label绑定到'Age'属性?

  2. 在运行时,我将创建一个'Person'实例;我想确保我的Label绑定到正确的实例;即如果我打电话:

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

    我希望我的Lable能够为'SomePerson'获得'Age'属性的新价值。

  3. 如果我在不同的线程中调用'GetOlder'(无论是使用Dispatcher线程还是BackgroundWorker)怎么办?我还能获得'Age'的最新价值吗?或者我是否还需要处理其他一些事情以使这种情况成为可能?

  4. 提前致谢,

    TheBlueSky

1 个答案:

答案 0 :(得分:1)

事实证明这是一种直截了当的事情,我想知道为什么没有人回答:)无论如何,这里有答案:

  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++;
            }
        }
    }
    
  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();
    
  4. 希望这有帮助。

    TheBlueSky