Converter的作用是实现源数据和目标对象数据的转换。
WPF的Converter分为单个/多个
IValueConverter
要实现一个Converter需要实现接口IValueConverter,该接口如下
public interface IValueConverter
{
object Convert(object value, Type targetType, object parameter, CultureInfo culture);
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
}
1.Convert是实现源数据到目标对象数据的函数
2.ConvertBack这函数,是当BindingMode为TwoWay的时候,目标对象数据变化时,转化为源数据时候需要用到,其它的该函数可以不实现该函数。
我们以一个string转成int的Converter来演示,该Converter的功能实现string转int,返回转换的时候把原string前面加上"AAA"转换回去,如下
class StringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string param = value as string;
int val = 0;
if(int.TryParse(param, out val))
{
return val;
}
return -1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return "AAA" + value;
}
}
我们在xaml中定义如下
<Window.Resources>
<local:StringConverter x:Key="StringConverter"/>
</Window.Resources>
<StackPanel Orientation="Vertical">
<TextBox Margin="5" x:Name="TextBoxName" Text="AAAA"/>
<TextBox Margin="5" x:Name="TextBoxName2" Text="{Binding Text,Mode=TwoWay,ElementName=TextBoxName,Converter={StaticResource StringConverter},ConverterParameter=TextBoxName}"/>
</StackPanel>
说明:
1.TextBoxName2显示的内容以Binding 到TextBoxName的Text内容作为数据源,并且设置BindingMode为TwoWay,通过StringConverter来实现数据转换并且最终在TextBoxName2上显示。
2.在TextBoxName输入内容时,通过StringConverter的Converter转换,TextBoxName2也显示相同的数据,
3.如果在TextBoxName2输入内容时,通过StringConverter的ConvertBack转换数据,最终显示在TextBoxName上。
IMultiValueConverter
定义一个MultiStringConverter
class MultiStringConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string temp1 = values[0] as string;
string temp2 = values[0] as string;
return temp1 + "+" + temp2;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
在xaml中使用该 MultiStringConverter
<StackPanel>
<TextBlock Text="String 1" x:Name="string1Name"/>
<TextBlock Text="String 2" x:Name="string2Name"/>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource MultiStringConverter}">
<Binding Path="Text" ElementName="string1Name"/>
<Binding Path="Text" ElementName="string2Name"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
说明:
1.名称为ResultName的TextBlock的内容以string1Name和string2Name的Text为内容显示
2.ResultName的TextBlock通过MultiStringConverter把string1Name和string2Name的Text内容组合显示,
显示结果如下