правильно ли использовать событие OnPropertyChanged, чтобы попросить приложение сделать что-то? - PullRequest
0 голосов
/ 22 февраля 2012

Мое приложение MVVM содержит два представления:

  • AllStrategiesView
  • StrategyView

Когда пользователь нажимает определенную стратегию в AllStrategiesView, создается StrategyView с этой стратегией.Я использую такой код для уведомления приложения о том, что StrategyView должен быть создан:

    .............
    public void OpenStrategyView()
    {
        OnPropertyChanged("OpenStrategy");
    }
    .................
    private void OnWorkspacePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        const string openStrategyString = "OpenStrategy";
        if (e.PropertyName == openStrategyString)
        {
            AllStrategiesViewModel vm = (sender as AllStrategiesViewModel);
            OpenStrategy(vm.SelectedStrategy);
        }
    }

Однако другая часть программы показывает сообщение об ошибке, потому что нет такого свойства "OpenStrategy":

    /// <summary>
    /// Warns the developer if this object does not have
    /// a public property with the specified name. This 
    /// method does not exist in a Release build.
    /// </summary>
    [Conditional("DEBUG")]
    [DebuggerStepThrough]
    public void VerifyPropertyName(string propertyName)
    {
        // Verify that the property name matches a real,  
        // public, instance property on this object.
        if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        {
            string msg = "Invalid property name: " + propertyName;

            if (this.ThrowOnInvalidPropertyName)
                throw new Exception(msg);
            else
                Debug.Fail(msg);
        }

Вопрос:

Правильно или неправильно использовать OnPropertyChanged для уведомления приложения о необходимости что-то сделать?Должен ли я переписать свой код, чтобы не использовать OnPropertyChanged, или я должен отключить код VerifyPropertyName?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

Ну, это зависит от того, что вы хотите сделать.В вашем случае, похоже, у вас есть свойство «Рабочая область», которое указывает, на какую виртуальную машину вы должны смотреть.Это не кажется слишком плохим для использования IMHO.

Если вы делали что-то совершенно не связанное с измененным свойством, это могло бы сработать, но это, конечно, не то, что я ожидал бы сделать (см. принцип наименьшего удивления ).OnPropertyChanged предназначен для указания того, что свойство, к которому привязана привязка, изменилось и должно быть повторно получено.

Конечно, вы можете просто создать другое событие в вашей ViewModel, например:

public event Action<String> OpenStrategy;

Еще одна вещь ... Этот код полностью избыточен:

const string openStrategyString = "OpenStrategy";
if (e.PropertyName == openStrategyString)

следующее с точки зрения компилятора точно такое же и гораздо более читаемое:

if (e.PropertyName == "OpenStrategy")
0 голосов
/ 22 февраля 2012

Нет ничего плохого в том, что ваше приложение запрашивает что-то в событии PropertyChanged, однако не вызывайте событие PropertyChanged только для того, чтобы приложение что-то сделало.

PropertyChanged используется для указания того, что свойство изменилось, и должно использоваться только для этого.

Ответ Devdigital дает хороший пример того, что пользовательский интерфейс использует уведомление PropertyChange, чтобы знать, когда оно должно обновляться.Другие объекты также могут подписываться на получение уведомлений об изменениях, и они должны уведомляться только при изменении значения, а не когда вы хотите запустить какой-либо код приложения.

Используя ваш пример, я бы переписал его так:

public void OpenStrategyView()
{
    OpenStrategy(this.SelectedStrategy);
}

private void OnWorkspacePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SelectedStrategy")
    {
        OpenStrategyView();
    }
}
0 голосов
/ 22 февраля 2012

Это плохая практика.Событие PropertyChanged в INotifyPropertyChanged должно использоваться для уведомления подписчиков об изменении свойства в экземпляре объекта.Обычно это используется в WPF для уведомления пользовательского интерфейса о том, что ему необходимо обновить себя с новым значением свойства.

В MVVM вы должны использовать какой-либо командный или альтернативный механизм связи viewmodel / view для вызова глаголов (методов) по вашему мнению модель из вида.Команды, предоставляемые WPF, имеют ограничения, поэтому я рекомендую использовать MVVM framework и механизмы, которые они предоставляют.

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