.NET Databinding игнорирует изменение свойства - PullRequest
1 голос
/ 26 ноября 2008

Я написал элемент управления в C #, который происходит от System.Windows.Forms.Control. Я добавил свойство Selected, к которому хочу привязать данные к бизнес-объекту, используя BindingSource.

Я реализовал шаблон PropertyNameChanged, добавив событие SelectedChanged, которое вызывается при изменении свойства 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.

Чего мне не хватает?

1 Ответ

1 голос
/ 26 ноября 2008

Установлен ли для режима обновления привязки значение 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...