【问题标题】:.NET Databinding ignores property change.NET 数据绑定忽略属性更改
【发布时间】:2008-11-26 10:39:18
【问题描述】:

我用 C# 编写了一个派生自 System.Windows.Forms.Control 的控件。我添加了一个属性 Selected,我想使用 BindingSource 将其数据绑定到业务实体。

我通过添加一个 SelectedChanged 事件来实现 PropertyNameChanged 模式,该事件在 Selected 属性更改时触发。

这是我的代码:

public partial class RateControl : Control
{
    [Category("Property Changed")]
    public event EventHandler SelectedChanged;

    public int Selected
    {
      get
      { return m_selected; }
      set
      {
        if (m_selected != value)
        {
          m_selected = value;
          OnSelectedChanged();
          Invalidate();
        }
      }
    }

    protected virtual void OnSelectedChanged()
    {
      if (this.SelectedChanged != null)
        this.SelectedChanged(this, new EventArgs());
    }
}

当我绑定到 Selected 属性时,我看到了正在订阅的事件。该事件也会在属性更改时触发。

但是业务实体没有更新。我什至没有看到被访问的 Selected 属性的 getter。

我错过了什么?

【问题讨论】:

    标签: c# data-binding


    【解决方案1】:

    您是否已将绑定的更新模式设置为 DataSourceUpdateMode.OnPropertyChanged?通过binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; 或使用DataBindings.Add(...) 重载之一。

    以下内容适用于将值推送到业务对象...

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    
    class MyForm : Form
    {
        public MyForm()
        {
            MyBusinessObject obj = new MyBusinessObject();
            Button btn = new Button();
            btn.Click += delegate { Foo++; };
            DataBindings.Add("Foo", obj, "Bar", false, DataSourceUpdateMode.OnPropertyChanged);
            DataBindings.Add("Text", obj, "Bar");
            Controls.Add(btn);
        }
    
        private int foo;
        public event EventHandler FooChanged;
        public int Foo
        {
            get { return foo; }
            set
            {
                if (foo != value)
                {
                    foo = value;
                    Debug.WriteLine("Foo changed to " + foo);
                    if (FooChanged != null) FooChanged(this, EventArgs.Empty);
                }
            }
        }
    }
    
    class MyBusinessObject
    {
        private int bar;
        public event EventHandler BarChanged;
        public int Bar
        {
            get { return bar; }
            set
            {
                if (bar != value)
                {
                    bar = value;
                    Debug.WriteLine("Bar changed to " + bar);
                    if (BarChanged != null) BarChanged(this, EventArgs.Empty);
                }
            }
        }
    }
    
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new MyForm());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多