Wpf 将一个元素绑定到两个源

Wpf 将一个元素绑定到两个源,wpf,binding,Wpf,Binding,我目前有两个文本框,可以接受任何数字。我有一个文本块,它接受输入的两个数字并计算平均值 我想知道是否有一种方法可以将此文本块绑定到两个文本框,并使用自定义转换器来计算平均值?我目前正在捕获两个文本框上的文本更改事件,并以这种方式计算平均值,但我假设数据绑定将更高效、更简单。您正在寻找的 您的XAML将如下所示: <TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource my

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

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

您正在寻找的

您的
XAML
将如下所示:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myConverter}">
      <Binding Path="myFirst.Value" />
      <Binding Path="mySecond.Value" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
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
}


通过对myConverter、myFirst.Value和mySecond.Value的合理替换,创建一个实现IMultiValueConverter的转换器。它可能看起来像这样:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myConverter}">
      <Binding Path="myFirst.Value" />
      <Binding Path="mySecond.Value" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
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
}
多值转换器接收一个对象数组,每个绑定一个。您可以根据需要处理这些,这取决于您是打算将其设置为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>

或者,您可以在code behind中创建一个属性,并将TextBlock绑定到该属性。。。我一直在做,这比做一个转换器,然后在那里做同样的代码要简单一些

示例:(在xaml的代码隐藏中):

然后,在XAML中:

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


这比定制转换器简单得多。

只需在Timothy的答案中添加一步一步的步骤:

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

  • 很抱歉你们中的一些人在没有XAML的情况下看到了这个。。。我忘了把它隔开。。。它现在就在那里:)您还可以在控件上放置一个x:Name,并在文本绑定中使用它,而不是在相对资源:)嗯,这不起作用。UserControl类中不存在AvgValue属性(在您的示例中),将UserControl x:type更改为TableRow(我扩展UserControl类的类)将找不到祖先。那么,您可以将这个示例扩展到一个更有效的解决方案吗?但是使用
    TextBlock Text=“{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl},Path=AvgValue}”
    通过创建另一个属性,会消耗额外的内存,比如说如果对象集合计数过大。如果我想将常量值传递给多重绑定的某个绑定,我该怎么做?请帮助!@Jacob:我错误地按下了投票按钮,现在它允许我还原它,并说“我不能,直到下一次编辑”:-(