Принудительный привязанный к данным флажок Windows Forms для немедленного изменения значения свойства при нажатии - PullRequest
6 голосов
/ 08 февраля 2011

У меня есть объект, который реализует INotifyPropertyChanged, и флажок, связанный с логическим свойством этого объекта. Это работает, но я обнаружил, что когда я устанавливаю или снимаю флажок, свойство привязанного объекта не обновляется до тех пор, пока я не нажму другой элемент управления, не закрою форму или иным образом не заставлю флажок терять фокус.

Я бы хотел, чтобы флажок вступил в силу немедленно. То есть, когда я отмечаю флажок, свойство должно быть немедленно установлено в true, а когда я снимаю флажок, оно должно быть немедленно установлено в false.

Я обошел это, добавив обработчик для события CheckedChanged флажка, но есть ли «правильный» способ сделать это, что я пропустил?


Аналогичный вопрос переполнения стека: Значение текстового поля / флажка с привязкой к базе данных неверно, пока текстовое поле / флажок не проверен .

1 Ответ

6 голосов
/ 08 февраля 2011

Установите режим привязки OnPropertyChanged:

this.objectTestBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.objectTestBindingSource.DataSource = typeof(WindowsFormsApplication1.ObjectTest);

this.checkBox1.DataBindings.Add(
  new System.Windows.Forms.Binding(
    "Checked", 
    this.objectTestBindingSource, 
    "SomeValue", 
    true, 
    System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

public class ObjectTest: System.ComponentModel.INotifyPropertyChanged
{
    public bool SomeValue
    {
        get { return _SomeValue; }
        set { _SomeValue = value; OnPropertyChanged("SomeValue"); }
    }

    private bool _SomeValue;

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        if (string.IsNullOrEmpty(name)) {
            throw new ArgumentNullException("name");
        }

        if (PropertyChanged != null) {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    ObjectTest t = new ObjectTest();
    this.objectTestBindingSource.Add(t);
}

Это работает, как только я нажимаю на поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...