2009-07-02 108 views
3

我有一個wpf xaml表單,其中有5個文本框顯示訂單價格。 在5個文本框下面我有另一個文本框:[subTotal]顯示訂單價格的小計。「SubTotal」文本框應該自動顯示訂單價格的小計。WPF-xaml計算文本框值總數

是否有任何XAMl編碼方式,當用戶在訂單價格文本框中輸入值時,我可以自動計算和顯示「SubTotal」文本框中的總數。

回答

2

如果你使用綁定(和一個小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,我可以對此進行擴展。

10

使用該轉換器:

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> 

的樣子:

screenshot