65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2012年2月13日

CPOL

2分钟阅读

viewsIcon

217510

MultiBinding 允许我们将绑定目标属性绑定到一系列源属性,然后应用逻辑来根据给定的输入产生一个值。

有关值转换器的介绍,请参阅 此处 的文章。

有关模式属性的更多信息,请参阅 此处 的文章。

MultiBinding 允许我们将绑定目标属性绑定到一系列源属性,然后应用逻辑来根据给定的输入产生一个值。 此示例演示如何使用 MultiBinding。 以下示例生成一个 TextBox,它将 TextBox1TextBox2 中的数字相加,并将结果放入 TextBox3 中。 这里有两个源属性和一个目标属性。 当您在 TextBox1TextBox2 中输入数字时,转换器就会发挥作用,自动将它们相加并将结果放入 TextBox3 中。 ModeUpdateSourceTrigger 属性的值决定了 MultiBinding 的功能,并用作集合中所有绑定的默认值,除非单个绑定覆盖了这些属性。 例如,如果 MultiBinding 对象上的 Mode 属性设置为 TwoWay,则集合中的所有绑定都被视为 TwoWay,除非您显式地为其中一个绑定设置了不同的 Mode 值。

在以下代码中,AddConverter 实现了 IMultiValueConverter 接口。 AddConverter 接收来自各个绑定的值,并将它们存储在 values 对象数组中。 绑定元素在 MultiBinding 元素下出现的顺序就是这些值存储在数组中的顺序。

图 1:重要类层次结构

图 2:绑定类层次结构

上述逻辑的 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 对象与转换器一起使用时,它会根据这些绑定的值生成绑定目标的最终值。 例如,颜色可以从红色、蓝色和绿色值计算得出,这些值可以来自相同的或不同的绑定源对象。 当值从目标移动到源时,目标属性值会被转换为一组反馈到绑定的值。

此处 下载源代码。

如果这是一个好主意,那就去做吧。 获得原谅比获得许可容易得多。
- 格蕾丝·霍珀海军上将。

© . All rights reserved.