【问题标题】:How to use DataBindings property properly?如何正确使用 DataBindings 属性?
【发布时间】:2016-04-27 22:15:18
【问题描述】:

我正在尝试将 Windows 窗体标签绑定到变量。当我运行该代码时,lable1 显示为 50,但是当我使用 button1 递增时,它不会更改为 51。这是我的尝试

    int x = 50;
    public int X
    {
        get { return x; }
        set { x = value; }
    }
    public Form1()
    {
        InitializeComponent();
        label1.DataBindings.Add("Text", this, "X", true, DataSourceUpdateMode.OnPropertyChanged);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        X++;
    }

TIA

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    您可以将您的数据放在另一个实现 INotifyPropertyChanged 的​​类中,以便通知和更新 UI:

    public partial class Form1 : Form
    {
        DataClass dc;
        public Form1()
        {
            InitializeComponent();
            dc = new DataClass();
            label1.DataBindings.Add("Text", dc, "X", true, DataSourceUpdateMode.OnPropertyChanged);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            dc.X++;
        }
    }
    
    public class DataClass : INotifyPropertyChanged
    {
        int x = 50;
        public int X
        {
            get { return x; }
            set
            {
                x = value;
                NotifyPropertyChanged("X");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }
    }
    

    【讨论】:

    • 谢谢。我可以在静态类上使用它吗?我可以使用变量而不是属性吗?
    • 我看不到使用静态类的方法。数据绑定需要Add() 方法的对象实例。您必须使用 DataSourceUpdateMode.OnPropertyChanged 的属性
    【解决方案2】:
        int X = 50;
    
        public Form1() {
            InitializeComponent();
            label1.Text = X.ToString();            
        }
    
        private void button1_Click(object sender, EventArgs e) {
            X += 1;
            label1.Text = X.ToString();
        }
    

    【讨论】:

      【解决方案3】:

      您的 Class Form 必须实现 INotifyPropertyChanged 接口,如下所示:

          public partial class Form1 : Form, INotifyPropertyChanged
          {
      
              int x = 50;
              public int X
              {
                  get { return x; }
                  set { x = value; OnPropertyChanged("X"); }
              }
      
              private void Form1_Load(object sender, EventArgs e)
              {
                  label1.DataBindings.Add("Text", this, "X", true, DataSourceUpdateMode.OnPropertyChanged);
              }
      
              private void button1_Click(object sender, EventArgs e)
              {
                  X++;
              }
              public event PropertyChangedEventHandler PropertyChanged;
      
              protected virtual void OnPropertyChanged(string property)
              {
                  if (PropertyChanged != null)
                      PropertyChanged(this, new PropertyChangedEventArgs(property));
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 2015-08-31
        相关资源
        最近更新 更多