绑定一个元素到两个来源

我目前有两个文本框可以接受任何数字。 我有一个文本块,input两个数字并计算平均值。

我想知道是否有一种方法可以将这个文本块绑定到两个文本框,并利用自定义转换器来计算平均值? 我目前正在捕捉两个文本框上的文本更改事件,并计算平均值,但我假设数据绑定将更加高效和容易。

您正在寻找MultiBinding

你的XAML将如下所示:

 <TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource myConverter}"> <Binding Path="myFirst.Value" /> <Binding Path="mySecond.Value" /> </MultiBinding> </TextBlock.Text> </TextBlock> 

合理replacemyConvertermyFirst.ValuemySecond.Value

创build一个实现IMultiValueConverter的转换器。 它可能看起来像这样:

 class AverageConverter : IMultiValueConverter { #region IMultiValueConverter Members public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { int total = 0; int number = 0; foreach (object o in values) { int i; bool parsed = int.TryParse(o.ToString(), out i); if (parsed) { total += i; number++; } } if (number == 0) return 0; return (total/number).ToString(); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } 

一个多值转换器接收一个对象数组,每个绑定一个。 你可以处理这些,不pipe你需要什么,取决于你是打算用double还是int。

如果两个文本框都是数据绑定的,那么可以在文本块的多重绑定中使用相同的绑定(记住在属性更改时通知,以便更新平均值),也可以通过引用ElementName的文本框来获取文本值。

 <TextBox Text="{Binding Value1}" x:Name="TextBox1" /> <TextBox Text="{Binding Value2}" x:Name="TextBox2" /> <TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource AverageConverter}"> <Binding ElementName="TextBox1" Path="Text" /> <Binding ElementName="TextBox2" Path="Text" /> <!-- OR --> <!-- <Binding Path="Value1" /> --> <!-- <Binding Path="Value2" /> --> </MultiBinding> </TextBlock.Text> </TextBlock> 

或者,您可以在代码后面创build一个属性,然后将TextBlock绑定到该属性上…我一直这样做,这比制作转换器简单一些,然后在那里执行相同的代码。

例子:(在你的代码的xaml后面):

 public double AvgValue { get { return (valueA + valueB) / 2.0; } } 

然后,在你的XAML中:

 <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=AvgValue}" /> 

这比自定义转换器更简单。

只是为蒂莫西的回答添加循序渐进的过程:

  1. 设置View.TextBlock.Text属性以绑定到ViewModel.AvgValue属性。
  2. 捕获TextBox控件的TextChanged事件,然后在该TextChanged事件的处理程序中设置AvgValue。
  3. 作为步骤2中处理程序的一部分,请确保引发属性更改,以便更新TextBlock。