Обновление свойства свойства MVVM viewmodel - PullRequest
0 голосов
/ 22 сентября 2010

Я начал внедрять MVVM для одного из моих приложений Silverlight. (Я не использую какой-либо инструментарий).

Моя страница содержит раздел с двумя полями со списком. Выбор элемента в одной из этих комбинаций запускает поиск, который обновляет сетку, видимую под комбинациями.

Каждый выбранный комбо-элемент привязан к свойству в моей модели представления. Установщик этих свойств вызывает изменение свойства INotifyPropertyChanged и автоматически обновляет данные, связанные с сеткой.

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

  • Если функция сброса в модели представления обновляет вспомогательные поля, пользовательский интерфейс не будет отражать изменения, так как RaisePropertyChanged не будет вызываться.
  • Если функция сброса в модели представления обновляет свойства, пользовательский интерфейс будет отражать изменения, но сетка будет обновляться дважды: при сбросе первого свойства на ноль, а также на второе

Любая помощь приветствуется

/// <summary>Selected user.</summary>
public User SelectedUser
{
    get { return _selectedUser; }
    set
    {
        _selectedUser = value;
        RaisePropertyChanged("SelectedUser");

        UpdateProducts();
    }
}

/// <summary>Selected product category.</summary>
public ProductCategory SelectedProductCategory
{
    get { return _selectedProductCategory; }
    set
    {
        _selectedProductCategory = value;
        RaisePropertyChanged("SelectedProductCategory");

        UpdateProducts();
    }
}

// Reset option 1
public void Reset()
{
    _selectedUser = null;
    _selectedProductCategory = null;
    _products = null;
}

// Reset option 2
public void Reset()
{
    SelectedUser = null;
    SelectedProductCategory = null;
    // No need to update Products which has already been updated twice...
}

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

Это то, что действительно воодушевляет меня во многих рамках, включая WPF. Что вам нужно, так это некоторая концепция задержки ответа на уведомления об изменениях, чтобы пользователь никогда не видел промежуточные состояния. Однако вы не можете изменить способ, которым WPF реагирует на ваши уведомления, поэтому лучшее, что вы можете сделать, - это отложить ваши уведомления до «после того, как пыль осядет». В вашем случае вы захотите изменить оба поля поддержки перед отправкой уведомлений. Ваш метод сброса может закодировать эту идею следующим образом:

public void Reset()
{
    _selectedUser = null;
    _selectedProductCategory = null;
    _products = null;

    RaisePropertyChanged("SelectedUser");
    RaisePropertyChanged("SelectedProductCategory");
}

На мой взгляд, способ, которым WPF синхронно обновляет дисплей в ответ на уведомления об изменениях, просто неверен. Их система DependencyProperty дает им возможность просто пометить зависимости как грязные и выполнить пересчет в более позднее время.

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

1 голос
/ 22 сентября 2010

Вы можете вызвать одно событие PropertyChanged для всех свойств после обновления полей поддержки:

RaisePropertyChanged(String.Empty);
0 голосов
/ 22 сентября 2010

Если вы используете вспомогательные поля, вам придется вызывать

RaisePropertyChanged("SelectedUser");
RaisePropertyChanged("SelectedProductCategory");

в методе Reset ().

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