Как уведомить пользовательский интерфейс об изменении с помощью свойства readonly? - PullRequest
6 голосов
/ 30 августа 2011

В WPF у меня есть свойство только с get {}. Значение исходит из возврата метода. NotifyPropertyChanged часто используется в наборе свойств {}. Затем он может уведомить пользовательский интерфейс и отобразится обновленное значение. Но только с get {} нет способа определить, доступно ли новое или другое значение, поскольку необходимо выполнить метод для проверки.

Есть ли способ обновить пользовательский интерфейс без необходимости сохранять локальное значение, которое содержит последнее значение из метода, и в этом случае необходимо выполнить сравнение?

Ответы [ 2 ]

11 голосов
/ 30 августа 2011

Но только с get {} невозможно определить, доступно ли новое или другое значение, так как необходимо выполнить метод для проверки.

Проблема сводится к следующему: что меняет собственность?Метод, который изменяет свойство, должен вызывать ваш NotifyPropertyChanged с именем свойства, что, в свою очередь, заставит WPF повторно получить значение и обновить пользовательский интерфейс.

WPF не волнует where событие PropertyChanged возникает - оно просто прослушивает его и обновляет привязку по мере необходимости.


Редактировать в ответ на комментарий:

Звучит такэто может быть результатом выполнения некоторой операции с вашим классом Model.В этом случае обычно вы знаете, что одно или несколько свойств могут меняться, но не обязательно, какие из них.Если ваша Модель реализует INotifyPropertyChanged, вы можете подписаться на нее и «всплывать» уведомления в пользовательском интерфейсе с помощью вашего метода NotifyPropertyChanged.Если это не так, существует другая опция.

Если вы знаете, что одно или несколько свойств могут измениться, вы можете вызвать событие PropertyChanged с string.Empty в качестве PropertyName в EventArgs.Это приведет к обновлению всех связанных свойств WPF.Вероятно, это просто вопрос вставки чего-то подобного в ваш код:

this.Model.DoSomething(); // This will change 1+ properties
this.NotifyPropertyChanged(string.Empty); // Refresh our entire UI

Однако я бы не рекомендовал делать это везде, так как это увеличивает накладные расходы - но часто это самое чистое решение, если вы ненеизвестно, какие свойства изменятся при выполнении операции.

2 голосов
/ 30 августа 2011

Да.Если вы меняете исходные данные, вам нужно запустить INotify для свойства.Вот пример.

private int _myvalue = 3;

  public bool MyProperty
    {
        get { return IsAProperty(); }
    }

public bool IsAProperty()
{
    return _myvalue + 1 == 4;
}
public void SetValue(int value)
{
    _myvalue = value;
    NotifyPropertyChanged(MyProperty);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...