前言
wpf中经常有这种需求,比如内存中存在一个Bool类型的变量,界面有个控件的背景色由内存中bool变量来控制,当变量为true时,界面为绿色;当变量为false时,界面为空色,这时直接使用数据绑定是不可行的,比如将界面控件的background属性和内存中的bool变量直接绑定这是不行的,所以需要数据转换作为桥梁。
1、数据转换实现
主要是通过实现IValueConverter接口来实现,该接口中存在Convert和ConvertBack两个方法
csharp
public class BoolToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
SolidColorBrush bgBrush = ((bool)value) ? new SolidColorBrush((Color)ColorConverter.ConvertFromString("GREEN")) : new SolidColorBrush((Color)ColorConverter.ConvertFromString("RED"));
return bgBrush;
}
else
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("RED"));
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is SolidColorBrush)
{
SolidColorBrush brush = value as SolidColorBrush;
if(brush.Color ==Colors.Green )
{
return true;
}
else
{
return false;
}
}
else
{
return null;
}
}
}
然后通过下面的代码将这个类转变为可通过key引用的资源。
csharp
<Window.Resources>
<local:BoolToColorConverter x:Key="BoolToColor"/>
</Window.Resources>
最后看下面的代码中Button的Background属性和CheckBox 的IsChecked属性绑定,Converter={StaticResource BoolToColor}指定使用什么转换。
csharp
<Window x:Class="wpf之转换器.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之转换器"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:BoolToColorConverter x:Key="BoolToColor"/>
</Window.Resources>
<Grid>
<StackPanel Orientation="Vertical" >
<CheckBox Height="50" x:Name="check_test" />
<Button Height=" 100" Background="{Binding IsChecked,ElementName=check_test ,Converter={StaticResource BoolToColor}}" />
</StackPanel >
</Grid>
</Window>
1)当你选中CheckBox时,Button背景色变为绿色

2)当你取消选中CheckBox时,Button背景色变为红色

选中或者取消选中实际上调用的是Convert方法,将bool类型转为为颜色。