Converter(转换器)在 WPF 数据绑定中扮演着重要角色,用于在源数据和目标属性之间进行值转换
举例来说:我想用一个bool量来控制一个背景,为true时,显示红色;为false时背景用默认颜色。因此 Background="{Binding 某bool量}",这个bool量不是颜色值,怎么转换成颜色值?就需要一个继承自IValueConverter的转换器。见例子所示:
例一:bool量转换成颜色。
注意需要先在window.Resources中把这个类引用过来。
因为我这个转换类的命名空间就是这个定义的local中,可以直接写
<local:BooleanToColorConverter x:Key="BooleanToColorConverter"/>
如果命名空间不一致,则见例子2。
最终效果如下:


XML
<Window.Resources>
<local:BooleanToColorConverter x:Key="BooleanToColorConverter"/>
</Window.Resources>
<Grid>
<StackPanel >
<Border Height="50" Width="100"
Background="{Binding BSetRed,
Converter={StaticResource BooleanToColorConverter},
ConverterParameter=Red}"/>
<Button Content="反转颜色" Click="Button_Click" />
</StackPanel>
</Grid>
cs
public class BooleanToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if((bool)value)
{
return parameter;
}
else
{
return DependencyProperty.UnsetValue;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value == parameter);
}
}
cs
public partial class Window1 : Window,INotifyPropertyChanged
{
bool bSetRed = false;
public event PropertyChangedEventHandler PropertyChanged;
public bool BSetRed { get => bSetRed;
set
{
bSetRed = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("BSetRed"));
}
}
public Window1()
{
InitializeComponent();
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
BSetRed = !bSetRed;
}
}
例2:bool量转换成颜色。转换类放到其他命名空间下,比如Common.
此时因local下找不到这个类,所以报警。

此时:追加一个common的命名空间。然后程序可以正常运行。

cs
namespace AhuiPLC_CurveRecord.Common
{
public class BooleanToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if((bool)value)
{
return parameter;
}
else
{
return DependencyProperty.UnsetValue;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value == parameter);
}
}
}