WPF之Converter🔥
# 什么是Converter
WPF转换器(Converter)是一种在WPF(Windows Presentation Foundation)应用程序中执行数据转换的机制。它们允许你在绑定数据到用户界面元素时对数据进行转换、格式化或者其他定制操作。
WPF转换器通常实现了IValueConverter接口,该接口包括两个方法:Convert和ConvertBack。Convert方法用于将绑定源数据转换为绑定目标数据,而ConvertBack方法则用于将目标数据转换回源数据(对于双向绑定时)。
# 单值转化
下面是一个简单的示例,演示如何创建一个转换器来将布尔值转换为可见性枚举值:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace MyWPFApp
{
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool && (bool)value)
{
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value is Visibility && (Visibility)value == Visibility.Visible;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在XAML中使用转换器:
<Window x:Class="MyWPFApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWPFApp"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<TextBlock Text="Hello, World!" Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
</Grid>
</Window>
2
3
4
5
6
7
8
9
10
11
12
在这个示例中,我们创建了一个名为BooleanToVisibilityConverter的转换器,用于将布尔值转换为Visibility枚举值。然后在XAML中,我们将该转换器应用于TextBlock元素的可见性属性,以便根据IsVisible属性的值来决定文本块是否可见。
# 多值转化
在WPF中,有时你可能需要执行的转换涉及到多个输入值,这时你可以使用多值转换器(MultiValueConverter)。与单值转换器类似,多值转换器也实现了IMultiValueConverter接口,该接口包括Convert和ConvertBack方法,但是这些方法处理的是多个输入值而不是单个。 下面是一个简单的示例,演示如何创建一个多值转换器,将两个输入的值相加:
using System;
using System.Globalization;
using System.Windows.Data;
namespace MyWPFApp
{
public class AddConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length < 2)
return Binding.DoNothing;
double sum = 0;
foreach (var value in values)
{
if (value is double)
{
sum += (double)value;
}
}
return sum;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
在XAML中使用多值转换器:
<Window x:Class="MyWPFApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWPFApp"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:AddConverter x:Key="AddConverter" />
</Window.Resources>
<Grid>
<TextBox x:Name="textBox1" />
<TextBox x:Name="textBox2" />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource AddConverter}">
<Binding ElementName="textBox1" Path="Text" />
<Binding ElementName="textBox2" Path="Text" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</Window>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在这个示例中,我们创建了一个名为AddConverter的多值转换器,用于将两个输入的值相加。然后在XAML中,我们使用MultiBinding来绑定两个文本框的文本属性到TextBlock的文本属性,并且指定了我们刚刚创建的多值转换器。