WPF-xaml计算文本框值总数
问题描述:
我有一个wpf xaml表单,其中有5个文本框显示订单价格。 在5个文本框下面我有另一个文本框:[subTotal]显示订单价格的小计。“SubTotal”文本框应该自动显示订单价格的小计。WPF-xaml计算文本框值总数
是否有任何XAMl编码方式,当用户在订单价格文本框中输入值时,我可以自动计算和显示“SubTotal”文本框中的总数。
答
如果你使用绑定(和一个小MVVM模式),这将是相当容易的。表单的DataContext的设置是这样的:
using System;
using System.ComponentModel;
namespace WpfApplication1
{
[Serializable]
public class TestViewModel : INotifyPropertyChanged
{
private decimal value1;
private decimal value2;
private decimal value3;
private decimal value4;
private decimal value5;
public TestViewModel()
{
}
public decimal Value1
{
get { return value1; }
set
{
value1 = value;
RaisePropertyChangedEvent("Value1");
RaisePropertyChangedEvent("SubTotal");
}
}
public decimal Value2
{
get { return value2; }
set
{
value2 = value;
RaisePropertyChangedEvent("Value2");
RaisePropertyChangedEvent("SubTotal");
}
}
public decimal Value3
{
get { return value3; }
set
{
value3 = value;
RaisePropertyChangedEvent("Value3");
RaisePropertyChangedEvent("SubTotal");
}
}
public decimal Value4
{
get { return value4; }
set
{
value4 = value;
RaisePropertyChangedEvent("Value4");
RaisePropertyChangedEvent("SubTotal");
}
}
public decimal Value5
{
get { return value5; }
set
{
value5 = value;
RaisePropertyChangedEvent("Value5");
RaisePropertyChangedEvent("SubTotal");
}
}
public decimal SubTotal
{
get
{
return this.value1 + this.value2 + this.value3 + this.value4 + this.value5;
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChangedEvent(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}
显然,有很多不同的方法可以做到这一点,但如果你绑定您的文本框的值在这里,当1个文本框被改变了它会告诉查看(通过PropertyChanged事件)值和SubTotal已更新。然后屏幕将根据计算结果更新SubTotal的显示值。
如果您不熟悉绑定或如何设置表单的DataContext,我可以对此进行扩展。
答
使用该转换器:
public class SumConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
double _Sum = 0;
if (values == null)
return _Sum;
foreach (var item in values)
{
double _Value;
if (double.TryParse(item.ToString(), out _Value))
_Sum += _Value;
}
return _Sum;
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
这样做:
<Window.Resources>
<local:SumConverter x:Key="MySumConverter" />
</Window.Resources>
<StackPanel>
<TextBox Name="TextBox1" Text="1" />
<TextBox Name="TextBox2" Text="2" />
<TextBox Name="TextBox3" Text="3" />
<TextBox Name="TextBox4" Text="4" />
<TextBox Name="TextBox5" Text="5" />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource MySumConverter}"
StringFormat="{}{0:C}"
FallbackValue="Error" TargetNullValue="Null">
<Binding Path="Text" ElementName="TextBox1" />
<Binding Path="Text" ElementName="TextBox2" />
<Binding Path="Text" ElementName="TextBox3" />
<Binding Path="Text" ElementName="TextBox4" />
<Binding Path="Text" ElementName="TextBox5" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
的样子: