Привязка данных Winforms против PropertyChanged Проблема упорядочения событий - PullRequest
6 голосов
/ 04 января 2012

Извините, если раньше об этом спрашивали, но я попытался покопаться во множестве доступных вопросов по привязке данных и не смог найти тот, который соответствует моей проблеме.

Я выполняю однонаправленную привязку данныхмежду индексом списка и некоторым свойством одной из моих сущностей, , но Мне также нужно запустить некоторую дополнительную логику после , когда имеет место привязка данных.Я попытался сделать это так:

listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged);
listBox.SelectedIndexChanged += (s,e) => view.Refresh();

Проблема в том, что обработчик событий запускает до обновления привязки данных, но view.Refresh() зависит от значения entity.Property, которое будет обновлено.Это приводит к тому, что мое представление не обновляется до следующего изменения моего индекса.

Есть ли способ решить эту проблему с привязкой данных ?Сейчас я прибегаю к тому, чтобы не использовать привязку данных, когда у меня есть этот сценарий, а вместо этого делать это вручную:

listBox.SelectedIndex = entity.Property;
listBox.SelectedIndexChanged += OnIndexChanged;

private void OnIndexChanged(object sender, EventArgs e)
{
    entity.Property = listBox.SelectedIndex;
    view.Refresh();
}

Но я бы предпочел этого избежать, поскольку я использую привязку данных для всего остального ихотел бы сохранить последовательность.


Обновление

Я нашел решение.Похоже, сам объект Binding содержит событие BindingComplete, которое идеально подходит для этого.И так как метод DataBindings.Add возвращает мне объект Binding, я могу связать оба вместе.Поэтому мой код выглядит так:

listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged).BindingComplete += (s,e) => view.Refresh();

Мой единственный вопрос сейчас заключается в том, нужно ли позаботиться об отмене регистрации этого события вручную, или если я могу просто позвонить listBox.DataBindings.Clear(); и покончить с этим.

1 Ответ

4 голосов
/ 04 января 2012

Используемый вами метод возвращает экземпляр Binding . Почему бы не прослушать событие BindingComplete возвращенной привязки и вызвать оттуда метод Refresh ? Код, вероятно, должен будет оценить поля, такие как BindingCompleteContext и Исключение , чтобы убедиться, что событие инициируется при изменении источника данных. Вам не нужно вызывать listBox.DataBindings.Clear (). Привязки удаляются при удалении элемента управления. Обычно вам не нужно вручную отменять регистрацию события, и я думаю, что в этом случае вам не нужно вручную отменять регистрацию события.

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