2009-07-02 3 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 텍스트 상자가 변경됩니다 때, 그것은 말할 것이다 PropertyChanged 이벤트를 통해 값과 하위 합계가 업데이트되었는지 확인합니다. 그런 다음 화면은 계산 된 값을 기반으로 표시된 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(); 
    } 
} 

이 :

10

이 변환기를 사용

<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