绑定一个元素到两个来源
我目前有两个文本框可以接受任何数字。 我有一个文本块,input两个数字并计算平均值。
我想知道是否有一种方法可以将这个文本块绑定到两个文本框,并利用自定义转换器来计算平均值? 我目前正在捕捉两个文本框上的文本更改事件,并计算平均值,但我假设数据绑定将更加高效和容易。
您正在寻找MultiBinding
。
你的XAML
将如下所示:
<TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource myConverter}"> <Binding Path="myFirst.Value" /> <Binding Path="mySecond.Value" /> </MultiBinding> </TextBlock.Text> </TextBlock>
合理replacemyConverter
, myFirst.Value
和mySecond.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}" />
这比自定义转换器更简单。
只是为蒂莫西的回答添加循序渐进的过程:
- 设置View.TextBlock.Text属性以绑定到ViewModel.AvgValue属性。
- 捕获TextBox控件的TextChanged事件,然后在该TextChanged事件的处理程序中设置AvgValue。
- 作为步骤2中处理程序的一部分,请确保引发属性更改,以便更新TextBlock。