Неправильно ли запускать вычисления из установщиков свойств в модели представления? - PullRequest
0 голосов
/ 26 мая 2018

Скажем, у меня есть модель представления, которая имеет свойства цены и количества в модели представления, реализующей INotifyPropertyChanged, которые привязаны к текстовым полям, а свойство общей стоимости - к текстовому блоку.Когда обновляется либо цена, либо количество, следует пересчитать общую стоимость.

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

  1. Подпишитесь на событие PropertyChanged и запустите расчет оттуда.Я чувствую, что это событие больше для внешних наблюдателей, чем для использования в самой модели представления, и в любом случае любое событие инициируется из установщика, поэтому я не вижу, насколько оно сильно отличается от запуска обработки непосредственно из установщика.

  2. Запустить вычисление из события в текстовом поле (скажем, LostFocus), к которому привязано свойство, либо напрямую вызвав метод в модели представления из события, либо связав событие сКоманда на просмотр модели.Мне кажется, что с MVVM идея состоит в том, что мы должны избегать использования событий управления, если это возможно.

1 Ответ

0 голосов
/ 26 мая 2018

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

Я не вижу слишком много проблем при запуске вычисления в установщике свойств.Наверное, важно, как ты это делаешь.IHMO, это не хорошо для репликации OnPropertyChanged("CalculatedPropertyName") повсюду в вашем коде.

Я бы предпочел что-то вроде:

public int Quantity
{
    get { return quantity; }
    set 
    {
        if (value != quantity)
        {
            quantity = value;
            OnPropertyChanged();
            Result = Quantity * Price;
        }
    }
}

public int Price
{
    get { return price; }
    set 
    {
        if (value != price)
        {
            price = value;
            OnPropertyChanged();
            Result = Quanity * Price;
        }
    }
}

public int Result
{
    get { return result; }
    private set 
    {
        if (value != result)
        {
            result = value;
            OnPropertyChanged();
        }
    }
}

Таким образом, вы просто используете частный сеттер, и вы делаетеНе нужно помнить, чтобы поднять что-нибудь.Я предпочитаю этот способ, но если вы ищете более сложные способы, вы можете найти множество идей здесь и здесь .

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

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