5.2.3 WPF 中 XAML 文件 Converter 使用介绍

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);
        }
    }
}