Элемент управления не будет знать, что что-то изменилось, если объект не реализует INotifyPropertyChanged
. Затем средство установки свойства в объекте изменяется, чтобы вызвать событие 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
! Это легко сделать, и вы можете почесать голову, почему значение не обновляется.