wpf之数据类型转换

前言

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类型转为为颜色。

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》

2、《C#与PLC通信从入门到精通 》

3、《C# Modbus通信从入门到精通》

4、《C#Socket通信从入门到精通 》

5、《C# MES通信从入门到精通》

6、《winform控件从入门到精通》

7、《C#操作MySql数据库从入门到精通》

相关推荐
KmSH8umpK1 天前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第三篇
redis·分布式·wpf
宝桥南山1 天前
GitHub Models - 尝试一下使用GitHub Models
microsoft·ai·微软·c#·github·.netcore
hixiong1231 天前
C# OpenvinoSharp部署INSID3
开发语言·人工智能·ai·c#·openvinosharp
星辰徐哥1 天前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene
leoufung1 天前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#
hacker7071 天前
Visual Studio安装教程(C#开发版)
ide·c#·visual studio
SKY -dada1 天前
Understand 使用教程
开发语言·c#·流程图·软件构建·敏捷流程·代码复审·源代码管理
KmSH8umpK1 天前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案
redis·分布式·wpf
William_cl1 天前
【C#/.NET 进阶】ASP.NET 架构与最佳实践:DI 依赖注入(IoC 核心)从入门到避坑
c#·asp.net·.net
武藤一雄1 天前
WPF:MessageBox系统消息框
前端·microsoft·c#·.net·wpf