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