Работает ли Winforms DataBinding для программно измененных свойств?

2

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

Но если я вызываю значение UI.Property = в коде, тогда он не изменяет пользовательский интерфейс или исходный объект, указанный для DataBindings.Add.

Что я делаю неправильно? Я использую его неправильно?

Теги:
winforms
data-binding

1 ответ

8
Лучший ответ

Элемент управления не будет знать, что что-то изменилось, если объект не реализует INotifyPropertyChanged. Затем свойство setter в объекте изменяется, чтобы поднять событие PropertyChanged, передав имя свойства, которое было изменено в аргументах события.

INotifyPropertyChanged - это конкретный интерфейс, который механизм привязки данных в WinForms ищет при подключении привязки данных. Если он видит объект, который реализует этот интерфейс, он будет подписаться на его событие, и вы увидите, что ваш пользовательский интерфейс обновлен автоматически, не указывая, чтобы привязки данных перечитывали их значения (что и происходит, если вы повторно назначили DataSource и т.д.).

Не очевидно, но это имеет смысл, когда вы думаете. Без трансляции события, как элемент управления пользовательского интерфейса знает, что свойство изменилось? Он не опрокидывает недвижимость так часто. Должно быть сказано, что свойство изменилось, и событие PropertyChanged является обычным способом сделать это.

Что-то вроде (несжатый код)...


public class MyInterestingObject : INotifyPropertyChanged
{
    private int myInterestingInt;

    public event PropertyChangedEventHandler PropertyChanged;

    public int MyInterestingInt
    {
       get { return this.myInterestingInt; }
       set
       {
           if (value != this.myInterestingInt)
           {
               this.myInterestingInt = value;
               this.RaisePropertyChanged("MyInterestingInt");
           }
       }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
             handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Теперь любой код, имеющий привязку к этому объекту MyInterestingInt, будет обновляться, когда это свойство будет изменено. (Некоторым людям нравятся прокси-серверы для реализации этого интерфейса для них.)

Предостережение: убедитесь, что вы установили обновленное значение, прежде чем поднять событие PropertyChanged! Это легко сделать и может оставить вас почесывать голову о том, почему значение не обновляется.

  • 0
    Спасибо, буду искать статьи, как это реализовать.
  • 1
    Конечно, я добавил пример. MSDN также говорит об этом по адресу msdn.microsoft.com/en-us/library/… Удачи.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню