2009-07-02 8 views
3

J'ai une forme xaml wpf qui a 5 zones de texte indique le prix de la commande. Sous les 5 zones de texte, j'ai une autre zone de texte: [subTotal] qui affiche le sous-total des prix de la commande. "SubTotal" Textbox doit afficher automatiquement le sous-total des prix de la commande.WPF-xaml Calcul du total des valeurs de la zone de texte

Existe-t-il un moyen de codage XAMl où je peux calculer et afficher le total automatiquement dans la zone de texte "Sous-total", lorsque l'utilisateur saisit une valeur dans les zones de prix.

Répondre

2

Cela serait assez facile si vous utilisiez la liaison (et un petit modèle MVVM). Réglez le DataContext de votre formulaire à quelque chose comme ceci:

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

Évidemment, il y a beaucoup de façons différentes de faire, mais si vous liez vos champs de saisie des valeurs ici, quand 1 zone de texte se change, il dira la view (via l'événement PropertyChanged) cette valeur et SubTotal ont été mis à jour. Ensuite, l'écran mettra à jour la valeur affichée de SubTotal en fonction de ce qui a été calculé.

Je peux développer ce point si vous n'êtes pas familier avec la liaison ou comment définir le DataContext de votre formulaire.

10

En utilisant ce convertisseur:

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

Pour ce faire:

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

On dirait:

screenshot

Questions connexes