Как привязать ValueChanged элемента управления DecimalUpDown к ViewModel? - PullRequest
1 голос
/ 03 августа 2020
<xctk:DecimalUpDown Value="{Binding TotalAmount, Mode=TwoWay}" 
                  HorizontalAlignment="Right" 
                  Grid.Column="1"
                  VerticalAlignment="Center"  
                  Width="120" Height="21" Margin="5 0 0 0" />

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Вы должны написать свой лог c внутри обратного вызова каждого свойства. Подход обработчика событий ValueChanged требует тесно связанного кода, и он нарушит шаблон MVVM.

Если вы предпочитаете способ DP:

    public decimal Value1
    {
        get { return (decimal)GetValue(Value1Property); }
        set { SetValue(Value1Property, value); }
    }
    public static readonly DependencyProperty Value1Property =
        DependencyProperty.Register("Value1", typeof(decimal), typeof(MyVM), 
            new PropertyMetadata(0m, (d, e) =>
            {
                var vm = d as MyVM;
                vm.TotalValue = e.NewValue + vm.Value2;
            }));

    public decimal Value2
    {
        get { return (decimal)GetValue(Value2Property); }
        set { SetValue(Value2Property, value); }
    }
    public static readonly DependencyProperty Value2Property =
        DependencyProperty.Register("Value2", typeof(decimal), typeof(MyVM), 
            new PropertyMetadata(0m, (d, e) =>
            {
                var vm = d as MyVM;
                vm.TotalValue = e.NewValue + vm.Value1;
            }));

Или, если вы предпочитаете INotifyPropertyChanged способ:

    public decimal Value1
    {
        get => _value1;
        set { 
            _value1 = value; 
            TotalValue = value + Value2;
            NotifyPropertyChanged();
        }
    }
    public decimal Value2
    {
        get => _value2;
        set
        {
            _value2 = value;
            TotalValue = value + Value1;
            NotifyPropertyChanged();
        }
    }

Обратите внимание, что запись TotalValue = ... будет обрабатывать собственный NotifyPropertyChanged. Однако запись _totalValue = ... не работает.

0 голосов
/ 03 августа 2020

В MVVM вы должны поместить ValueChanged logi c в установщик свойства источника TotalAmount, поскольку это свойство устанавливается тогда, когда значение изменяется, например:

public decimal TotalAmount
{
    get { return _totalAmout; }
    set { _totalAmount = value; PropertyBoundToDecimalUpDown3 = _totalAmount + _otherAmount; }
}

Там не является причиной для обработки самого события при привязке к исходному свойству.

...