2009-07-02 33 views
3

私は5つのテキストボックスを持つwpf xamlフォームを持っています。 5つのテキストボックスの下に私は別のテキストボックスがあります:[subTotal]注文価格の小計を表示します。 "SubTotal" Textboxは注文価格の小計を自動的に表示します。WPF-xamlテキストボックス値の合計

ユーザーが注文価格のテキストボックスに値を入力すると、自動的に "小計"テキストボックスに計算して表示できるXAMlコーディング方法はありますか?

答えて

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、テキストボックスが変更された場合、それが教えてくれますValueとSubTotalが更新された(PropertyChangedイベント経由で)ビューを更新しました。次に、計算された値に基づいて表示されたSubTotalの値が更新されます。

バインディングやフォームのDataContextの設定方法に精通していない場合は、これを展開できます。このコンバータを使用して

10

screenshot

<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> 

は、次のようになります。

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(); 
    } 
} 

は、これを行います

関連する問題