Работает ли Winforms DataBinding для программно измененных свойств? - PullRequest
2 голосов
/ 23 октября 2009

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

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

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

1 Ответ

8 голосов
/ 23 октября 2009

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

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