UWP - MVVM - значение не обновляется при изменении вычисленного значения свойства - PullRequest
0 голосов
/ 26 мая 2020

Я разрабатываю приложение UWP на основе шаблона MVVM.

Я создал представление, привязанное к родительской модели представления. Модель родительского представления содержит свойство дочерней модели представления.

Модель представления дочернего элемента содержит некоторую информацию, особенно «NumberOfDays» и «AmountPerDay».

Модель родительского представления содержит собственные свойства, в частности «DiscountAmount» и «TravellingExpenseAmount». Родительская ViewModel Также содержит вычисляемые свойства: - TotalHT = (NumberOfDays * AmountPerDay) - DiscountAmount + TravellingExpenseAmount

это свойство привязано к «Total avant Taxes» на снимке экрана

Обратите внимание, что расчет основан на свойства из двух ViewModels.

Проблема заключается в следующем: - Когда я обновляю свойства из родительской ViewModel (DiscountAmount или TravellingExpenseAmount), изменяется расчетное свойство TotalHT и обновляется значение текстового поля - Когда я обновляю свойства из ChildViewModel (NumberofDays или AmountPerDay), Ничего не происходит, даже если из дочерней модели ViewModel я вручную RaisePropoertyChange родительского Calculated propoerty (RaisePropertyChange («Расчетное свойство»)).

enter image description here

Все модели ViewModels реализуют INotifiedPropertychange (набор инструментов MVVM light).

Обновление: кажется, что только свойства, созданные из двух моделей просмотра, не обновляются правильно

Есть ли у вас какие-либо идеи о решении ??

Обновление: Чтобы быть более точным, я обновил свой код, чтобы выяснить свою проблему на основе комментариев Антона (спасибо ему ;-))

Я заменил вычисленное свойство на "записываемое" Следующее свойство:

private string totalBeforTaxes3 = 0.ToString("C", CultureInfo.CurrentCulture);
    public string TotalBeforeTaxes3
    {
        get => totalBeforTaxes3;
        set => Set(() => TotalBeforeTaxes3, ref totalBeforTaxes3, value, true);
    }

Я устанавливаю значение по умолчанию на 0.

Я также создал метод для обновления значения и принудительного выполнения RaisePropertyChanged (даже если это бесполезно из-за того, что метод Set () уже делает это. Вот код метода:

public void CalculateTotalBeforeTaxes()
    {
        TotalBeforeTaxes3 = (Double.Parse(Details.TotalHT, NumberStyles.Currency) - Double.Parse(DiscountAmount, NumberStyles.Currency) + Double.Parse(TravellingExpensesAmount, NumberStyles.Currency)).ToString("C", CultureInfo.CurrentCulture);
        RaisePropertyChanged("TotalBeforeTaxes3");
    }

Теперь, когда я открываю страницу I, значение текстового поля равно O € и никогда не обновляется. Каждый раз, когда я обновляю значение, которое Часть расчета вызывается CalculateTotalBeforeTaxes () и RaisePropertyChanged вызывается без каких-либо ошибок.

Другая информация заключается в том, что ChildViewModel инициализируется не в конструкторе ParentViewModel, а после (из-за ограничения ViewModelLocator). есть удары ??

заранее спасибо

1 Ответ

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

Для обновления значения должен сработать триггер. В этом случае триггер не прыгает, и, следовательно, значение в родительском элементе никогда не будет пересчитано.

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

Когда мы создаем дочерний элемент, родитель подписывается на его события PropertyChanged (PropertyChangedEventHandler). Затем мы в родительском элементе получим аргумент PropertyChangedEventArgs, в котором у нас есть PropertyName. Если PropertyName - это то, что нам нужно - мы пересчитываем ИТОГО в родительской ВМ.

...