Извините, если раньше об этом спрашивали, но я попытался покопаться во множестве доступных вопросов по привязке данных и не смог найти тот, который соответствует моей проблеме.
Я выполняю однонаправленную привязку данныхмежду индексом списка и некоторым свойством одной из моих сущностей, , но Мне также нужно запустить некоторую дополнительную логику после , когда имеет место привязка данных.Я попытался сделать это так:
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();
и покончить с этим.