WPF之Converter🔥

1/25/2024 WPF

# 什么是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;
        }
    }
}
1
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>
1
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();
        }
    }
}
1
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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在这个示例中,我们创建了一个名为AddConverter的多值转换器,用于将两个输入的值相加。然后在XAML中,我们使用MultiBinding来绑定两个文本框的文本属性到TextBlock的文本属性,并且指定了我们刚刚创建的多值转换器。