【问题标题】:Bind WPF control with property of custom type将 WPF 控件与自定义类型的属性绑定
【发布时间】:2010-05-21 07:37:34
【问题描述】:

我正在尝试将标签的“内容”属性绑定到我拥有的某个自定义类型的属性;不幸的是,我不知道该怎么做,这就是我在这里的原因:)

假设我有以下类型(可以与包含标签的 WPF 窗口位于相同的命名空间或不同的命名空间):

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

        public int Age
        {
            get { return age; }
        }

        public void GetOlder
        {
            age++;
        }
    }
}
  1. 如何将我的标签绑定到“年龄”属性?

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

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

    我希望我的标签具有“SomePerson”的“Age”属性的新值。

  3. 如果我在不同的线程(无论是使用 Dispatcher 线程还是 BackgroundWorker)中调用了“GetOlder”怎么办?我还能获得“年龄”的最新值吗?或者我是否还必须处理其他一些事情才能使这种情况成为可能?

提前致谢,

蓝天

【问题讨论】:

    标签: c# binding


    【解决方案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();
      

    希望这会有所帮助。

    蓝天

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 2012-07-11
      • 2011-12-14
      • 2015-06-03
      • 2014-09-21
      • 2013-03-15
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多