我的界面中有这些文本框:
其中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
,但我不确定如何从这里开始
答案 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。这可能会对你有所帮助。