Прослушивание событий propertychanged для бизнес-логики

Мой вопрос может быть субъективным, и мне очень жаль, если это так.

Мы разрабатываем приложение UWP с некоторой функцией автосохранения, поэтому каждый раз, когда пользователь что-то обновляет, весь объект сохраняется в файловой системе.

Для этого я использовал интерфейс INotifyPropertyChanged для обнаружения изменения свойства в моем объекте или с событием PropertyChanged в дочерних объектах, если это необходимо. И когда изменение появляется через двустороннюю привязку данных, я сохранял весь объект. Что-то вроде (код может содержать опечатки, а не реальный код):

public class ObjectViewModel : ViewModelBase // from MVVM-Light
{
    public ObjectViewModel()
    {
        Section1 = new SectionViewModel();
        Section1.PropertyChanged += SectionOnPropertyChanged();
        Section2 = new SectionViewModel();
        Section2.PropertyChanged += SectionOnPropertyChanged();
    }

    public SectionViewModel Section1 { get; set; }

    public SectionViewModel Section2 { get; set; }

    private void SectionOnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        RaisePropertyChanged();
    }
}

public class SectionViewModel : ViewModelBase // from MVVM-Light
{
    private string _myString;
    public SectionViewModel()
    {
        Property1 = new SubPropertyViewModel();
        Property1.PropertyChanged += SubPropertyOnPropertyChanged();
        Property2 = new SubPropertyViewModel();
        Property2.PropertyChanged += SubPropertyOnPropertyChanged();
        MyString = "some value";
    }

    public string MyString
    {
        get => _myString;
        set => Set(ref _myString, value);
    }

    public SubPropertyViewModel Property1 { get; set; }

    public SubPropertyViewModel Property2 { get; set; }

    private void SectionOnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        RaisePropertyChanged();
    }
}

Теперь я могу прослушать событие PropertyChanged моего ObjectViewModel, чтобы сохранить его. Зная, что свойство MyString имеет двустороннюю связь с TextBox. И Property1 & 2 имеют двустороннюю привязку к пользовательскому UserControl (что-то вроде RadioButton).

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

Я правда не большой поклонник его модификаций.

Это плохая практика - слушать событие PropertyChanged для бизнес-логики?

Я думаю, что гораздо правильнее слушать PropertyChanged, чем событие Tapped. Это звучит как ужасное решение.

ChristianMurschall 10.09.2018 09:48
1
1
232
2

Ответы 2

PropertyChanged и постучал оба являются обратными вызовами, ни один из них не является хорошей или плохой практикой, поэтому это полностью зависит от того, как вы разрабатываете свое приложение, если вы уже делаете это с PropertyChanged, тогда продолжайте делать это, в этом нет никакого вреда. С другой стороны, задействованное событие также будет одинаково эффективным, поэтому для вашего конкретного сценария:

«НЕТ! PropertyChanged для бизнес-логики - неплохая практика.

На мой взгляд, если вы знакомы с MVVM, вам следует использовать команды, определенные в вашей модели представления, для реагирования на действия пользователя и описания бизнес-логики на уровне модели. Свойства, которые используются в привязках и «PropertyChangedEvent», не должны содержать никакой бизнес-логики, потому что это может замедлить ваш процесс разработки в будущем, превратившись в «спагетти-код», поскольку вы добавите больше функций, и вам будет трудно исследовать зависимости между свойствами.

Другие вопросы по теме