使用 IMultiValueConverter 和 MultiBinding 介绍多重绑定和多值转换器。





5.00/5 (10投票s)
MultiBinding 允许我们将绑定目标属性绑定到一系列源属性,然后应用逻辑来根据给定的输入产生一个值。
有关值转换器的介绍,请参阅 此处 的文章。
有关模式属性的更多信息,请参阅 此处 的文章。
MultiBinding 允许我们将绑定目标属性绑定到一系列源属性,然后应用逻辑来根据给定的输入产生一个值。 此示例演示如何使用 MultiBinding。 以下示例生成一个 TextBox,它将 TextBox1 和 TextBox2 中的数字相加,并将结果放入 TextBox3 中。 这里有两个源属性和一个目标属性。 当您在 TextBox1 和 TextBox2 中输入数字时,转换器就会发挥作用,自动将它们相加并将结果放入 TextBox3 中。 Mode 和 UpdateSourceTrigger 属性的值决定了 MultiBinding 的功能,并用作集合中所有绑定的默认值,除非单个绑定覆盖了这些属性。 例如,如果 MultiBinding 对象上的 Mode 属性设置为 TwoWay,则集合中的所有绑定都被视为 TwoWay,除非您显式地为其中一个绑定设置了不同的 Mode 值。
在以下代码中,AddConverter 实现了 IMultiValueConverter 接口。 AddConverter 接收来自各个绑定的值,并将它们存储在 values 对象数组中。 绑定元素在 MultiBinding 元素下出现的顺序就是这些值存储在数组中的顺序。


上述逻辑的 XAML 如下
<Window x:Class="DataConversion.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:mylocalXAMLnamespace="clr-namespace:DataConversion">
    <StackPanel>
        <StackPanel.Resources>
            <mylocalXAMLnamespace:AddConverter x:Key="XAMLResourceAddConverter" />
        </StackPanel.Resources>
        <TextBox Name="TextBox1" Text="10"></TextBox>
        <TextBox Name="TextBox2" Text="20"></TextBox>
        <Label Content="Sum of above two values:"></Label>
        <TextBox Name="textBox3">
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource XAMLResourceAddConverter}">
                    <Binding ElementName="TextBox1" Path="Text"/>
                    <Binding ElementName="TextBox2" Path="Text"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>
    </StackPanel>
</Window>
MultiBinding 标签接受 绑定 作为参数。 请参阅执行绑定的以下 C# 代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Markup;
namespace DataConversion
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    public class AddConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, 
               object parameter, System.Globalization.CultureInfo culture)
        {
            int result = 
                Int32.Parse((string)values[0]) + Int32.Parse((string)values[1]);
            return result.ToString();
        }
        public object[] ConvertBack(object value, Type[] targetTypes, 
               object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException("Cannot convert back");
        }
    }
}
您可以在 MultiBinding 对象中指定多个绑定。 当您将 MultiBinding 对象与转换器一起使用时,它会根据这些绑定的值生成绑定目标的最终值。 例如,颜色可以从红色、蓝色和绿色值计算得出,这些值可以来自相同的或不同的绑定源对象。 当值从目标移动到源时,目标属性值会被转换为一组反馈到绑定的值。
从 此处 下载源代码。
如果这是一个好主意,那就去做吧。 获得原谅比获得许可容易得多。
- 格蕾丝·霍珀海军上将。

