微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 计算Property Changed MVVM上两个值的结果

我试图通过MVVM中的以下简单公式计算“NetAmount”

GrossAmount + Carriage – discount = NetAmount

我正在使用MVVM Light Toolkit和声明的属性如下

public const string discountPropertyName = "discount";
private double _discount;
public double discount
{
    get
    {
        return _discount;
    }

    set
    {
        if (_discount == value)
        {
            return;
        }
        _discount = value;
        // Update bindings, no broadcast
        RaisePropertyChanged(discountPropertyName);
    }
}

public const string CarriagePropertyName = "Carriage";
private double _carriage;

public double Carriage
{
    get
    {
        return _carriage;
    }
    set
    {
        if (_carriage == value)
        {
            return;
        }
        _carriage = value;
        RaisePropertyChanged(CarriagePropertyName);
    }
}

public const string NetAmountPropertyName = "NetAmount";
private double _netAmount;

public double NetAmount
{
    get
    {
        _netAmount = Carriage + discount;
        return _netAmount;
    }
    set
    {
        if (_netAmount == value)
        {
            return;
        }
        _netAmount = value;
        RaisePropertyChanged(NetAmountPropertyName);
    }
}

public const string GrossAmountPropertyName = "GrossAmount";
private double _grossAmount;

public double GrossAmount
{
    get
    {
        return _grossAmount;
    }

    set
    {
        if (_grossAmount == value)
        {
            return;
        }
        _grossAmount = value;
        RaisePropertyChanged(GrossAmountPropertyName);
    }
}

我在XAML中使用以下文本框绑定这些属性

<TextBox Text="{Binding GrossAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DataContext="{Binding Mode=OneWay}"/>

<TextBox Text="{Binding Carriage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DataContext="{Binding Mode=OneWay}"/>

<TextBox Text="{Binding discount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DataContext="{Binding Mode=OneWay}"/>

我将文本块与NetAmount属性绑定如下:

<TextBlock Text="{Binding NetAmount}" />

viewmodel是SalesOrderviewmodel.

我不知道在哪里放置上面提到的公式,以便在更改任何文本框值时,它会导致更改NetAmount属性.

我不是C#的新手,但我是MVVM和PropertyChanged Events的新手,我知道有一些非常小的傻事我做错了但是无法理解它.

任何帮助将受到高度赞赏.

解决方法:

由于NetAmount是一种计算,因此将其建模为视图模型中的只读属性是有意义的.访问该属性实际上执行计算.最后一个技巧是每当影响NetAmount的任何因素发生变化时调用RaisePropertyChanged(NetAmountProperty)

public const string GrossAmountPropertyName = "GrossAmount";
private double _grossAmount;
public double GrossAmount
{
    get { return _grossAmount; }
    set 
    {
           if (_grossAmount == value)
                return;

           RaisePropertyChanged(GrossAmountPropertyName);
           RaisePropertyChanged(NetAmountPropertyName);
    }
}

public double discount{} ... //Implement same as above
public double Carriage {} ... //Implement same as above

public const string NetAmountPropertyName = "NetAmount";
public double NetAmount
{
    get { return GrossAmount + Carriage - discount; }
}

编辑:如果您不想向每个影响NetAmount的属性添加对RaisePropertyChanged的调用,则可以修改RaisePropertyChanged,以便它还为NetAmount属性引发PropertyChanged事件.它将导致一些不必要的PropertyChanged事件被引发但更易于维护

private void RaisePropertyChanged(string propertyName)
{
     var handler = PropertyChanged;
     if (handler != null)
     {
          handler(this, new PropertyChangedEventArgs(propertyName);
          handler(this, new PropertyChangedEventArgs(NetAmountProperty);
     }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐