У меня есть элементы управления пользовательским интерфейсом, которые используют метод DataBindings.Add, и он работает, если я вручную изменил указанное свойство пользовательского интерфейса, или исходный объект изменился за пределами.
Но если я вызываю значение UI.Property = в коде, тогда он не изменяет пользовательский интерфейс или исходный объект, указанный для DataBindings.Add.
Что я делаю неправильно? Я использую его неправильно?
Элемент управления не будет знать, что что-то изменилось, если объект не реализует 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
! Это легко сделать и может оставить вас почесывать голову о том, почему значение не обновляется.