MultiBinding 允许绑定多个源
子元素是指定绑定到各种属性上的Binding元素
例如下面:使用MultiBinding多绑定 通过子元素Binding指定了Person类中的LastName和FirstName属性,
需要使用多值转换器,把多个值转换为一个。(实现IMultiValueConverter接口)
这个转换器使用了一个参数(通过ConverterParameter指定的)
这个转换器参数values是从数据源中接收的多个值
参数parameter(通过ConverterParameter指定的),根据参数进行不同的转换
Person数据类
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
前台XAML
<Window x:Class="WpfApplication1.MultiBindingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:WpfApplication1.com.Data"
Title="多绑定" Height="300" Width="500">
<Window.Resources>
<local:Person x:Key="person1" FirstName="Tom" LastName="Turbo"/>
<local:PersonNameConverter x:Key="personNameConverter"/>
</Window.Resources>
<Grid DataContext="{StaticResource person1}">
<StackPanel>
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource personNameConverter}" ConverterParameter="LastFirst">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource personNameConverter}">
<MultiBinding.ConverterParameter>
<system:String>FirstLast</system:String>
</MultiBinding.ConverterParameter>
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
</StackPanel>
</Grid>
</Window>
以上代码不需要后台代码,数据源放在了Window.Resources中
以上两个TextBox使用的ConverterParameter方式不一样,第二种需要添加xmlns:system="clr-namespace:System;assembly=mscorlib 引用空间
PersonNameConverter多值转换器
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace WpfApplication1.com.Data
{
public class PersonNameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
switch(parameter as string)
{
case "FirstLast":
return values[0] + " " + values[1];
case "LastFirst":
return values[1] + "," + values[0];
default:
return "";
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}