WPF笔记7——TypeConverter类型

自定义对象如下:

点击查看代码
    public class Human
    {
        public string Name { get; set; }

        public Human Child { get; set; }
    }

需求1:点击界面上Button时弹出Human对象的Name信息

代码实现:

点击查看代码
<Window x:Class="HappyWPF.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:HappyWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <!--Button被点击后要显示的对象Human-->
        <local:Human x:Key="human" Name="Tim"/>
    </Window.Resources>
    
    <Grid> 
        <Button  Content="Show" Width="200" Height="50" Click="Button_Click"/>
    </Grid>
</Window>

Button事件代码:

点击查看代码
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Human h = this.FindResource("human") as Human;
            if (h != null)
            {
                MessageBox.Show(h.Child.Name);
            }
        }

需求2:点击界面上Button时弹出Human对象的Child的Name信息
前台代码修改如下:

点击查看代码
<Window x:Class="HappyWPF.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:HappyWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <!--给对象Human的Child赋值-->
        <local:Human x:Key="human" Name="Tim" Child="LittleTim"/>
    </Window.Resources>
    
    <Grid>
        
        <Button  Content="Show" Width="200" Height="50" Click="Button_Click"/>
    </Grid>
</Window>

直接运行会报错,原因是在xaml文件中Child="LittleTim"我们将string类型赋值给Child了,

但Child是Human类型,现在的代码无法将string转换成Human类型 。

对于这个问题,WPF给我们提供了一个TypeConverter类型。

TypeConverter位于System.ComponentModel命名空间中。

TypeConverter允许我们定义如何从字符串转换到特定的类型,以及如何将特定类型转换会String。 

1‌、从string转换到类型‌:当XAML解析器遇到需要设置为非字符串类型的属性时,它会使用TypeConverter将字符串值转换为所需的类型。

‌2、从类型转换到string:在某些情况下,可能需要将类型的值转换为字符串表示,例如在属性编辑器中显示值。



使用TypeConverter通常需要执行以下步骤:

1、创建自定义的TypeConverter:

* 继承自 TypeConverter 类。

* 重写 CanConvertFrom 方法来指定可以从哪些类型转换。

* 重写 CanConvertTo 方法来指定可以转换到哪些类型。

* 重写 ConvertFrom 方法来实现从其他类型到目标类型的转换。

* 重写 ConvertTo 方法来实现从目标类型到其他类型的转换。

2、应用TypeConverter:

* 在xaml中,使用 x:TypeArguments属性指定要转换的类型(如果TypeConverter是泛型的)。

* 在代码中,可以直接使用TypeConverter类进行转换。

3、在xaml中使用TypeConverterAttribute(可选):

* 如果我们希望在xaml中自动使用自己TypeConverter,可以在目标类型或属性上应用TypeConverterAttribute。

现在我们继续修改代码来实现需求2

继承TypeConverter类来定义我们自己的转换类:

点击查看代码
    public class NameToHumanTypeConverter : TypeConverter
    {
        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
        {
            if (value is string name)
            {
                Human child = new Human()
                {
                    Name = name
                };
                return child;
            }
            return base.ConvertFrom(context, culture, value);
        }
    }

给Human类型添加上标签,转换使用的是NameToHumanTypeConverter类型的转换器

点击查看代码
    // 在Human上应用TypeConverterAttribute以指定转换器
    [TypeConverterAttribute(typeof(NameToHumanTypeConverter))]
    public class Human
    {
        public string Name { get; set; }

        public Human Child { get; set; }
    }
现在运行程序就可以实现需求效果了。
posted @ 2024-12-02 11:27  青云Zeo  阅读(5)  评论(0编辑  收藏  举报