【问题标题】:WPF-xaml Calculating Total of text box valuesWPF-xaml 计算文本框值的总数
【发布时间】:2013-01-09 18:39:51
【问题描述】:

我有一个 wpf xaml 表单,其中有 5 个文本框显示订单价格。 在 5 个文本框下方我有另一个文本框:[subTotal] 显示订单价格的小计。“SubTotal”文本框应自动显示订单价格的小计。

当用户在订单价格文本框中输入值时,是否有任何 XAMl 编码方式可以让我自动计算并在“SubTotal”文本框中显示总计。

【问题讨论】:

    标签: wpf textbox


    【解决方案1】:

    使用此转换器:

    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>
    

    看起来像:

    【讨论】:

      【解决方案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,我可以对此进行扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 2015-07-15
        • 2011-05-12
        相关资源
        最近更新 更多