更改文本框的文本时执行方法

时间:2013-05-23 08:07:20

标签: c# wpf mvvm

我的界面中有这些文本框:

Image

其中Total和Change框是只读的。 我的问题是,当用户输入付款时,如何执行计算变更的方法?

有界付款文本框是:

private decimal _cartPayment;
public decimal CartPayment {
    get { return _cartPayment; }
    set { 
    _cartPayment = value;
    //this.NotifyPropertyChanged("CartPayment");
    }
}

我的XAML如下:

<TextBox Text="{Binding Path=CartPayment, Mode=TwoWay}" />

我的ViewModel实现了INotifyPropertyChanged,但我不确定如何从这里开始

4 个答案:

答案 0 :(得分:6)

您可以利用UpdateSourceTrigger。您可以修改代码,如

<TextBox Text="{Binding Path=CartPayment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

和你的财产一样

private decimal _cartPayment;
public decimal CartPayment
{
get { return _cartPayment; }
set 
 { 
  _cartPayment = value;
  // call your required
  // method here
  this.NotifyPropertyChanged("CartPayment");
 }
}

答案 1 :(得分:6)

这是一种MVVM方法,它不会破解任何属性'get / set:

<TextBox Text="{Binding Path=CartPayment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="TextChanged">
         <i:InvokeCommandAction Command="{Binding ComputeNewPriceCommand}" />
      </i:EventTrigger>
   <i:Interaction.Triggers>
</TextBox>

xmlns:i是xaml中的System.Windows.Interactivity命名空间 ComputeNewPriceCommand是指向重新计算方法的任何ICommand。

答案 2 :(得分:3)

您需要做的是添加到Binding UpdateSourceTrigger=PropertyChanged。默认情况下,当控件失去焦点以节省时间时,对象将被更新。

答案 3 :(得分:1)

我在我的应用程序中做了类似的事情,但计算了剩余的天数。

您可以尝试以下内容;

//Create a new class
public class ConreteAdder : IAdder
{
    public decimal Add(decimal total,decimal payment)
    {
        return total - payment; //What ever method or mathematical solution you want
    }
}

public interface IAdder
{
    decimal Add(decimal total, decimal payment);
}

然后,在您的VM中,实施以下内容;

    private readonly IAdder _adder = new ConreteAdder();
    private void NumberChanged() //Call this method within the properties you want to create the mathematical equation with
    {
        Change = _adder.Add(Payment, Total); //Or whatever method you want
    }

    public event PropertyChangedEventHandler PropertyChanged2;

    private void OnResultChanged()
    {
        var handler = PropertyChanged2;
        if (handler == null) return;
        handler(this, new PropertyChangedEventArgs("Result"));
    }

然后,在您的属性中,只需调用两种方法中的任何一种。 例如;

public decimal CartPayment 
{
get { return _cartPayment; }
set 
{ 
    _cartPayment = value;
    OnResultChanged(); //propertychanged event handler called
    this.NotifyPropertyChanged("CartPayment");
}
}

在你的xaml中像这样;

<TextBox Text="{Binding Path=CartPayment,UpdateSourceTrigger=PropertyChanged}" />

希望这有帮助! :)

编辑:看看Following link。这可能会对你有所帮助。