WinUI XAML赋值Byte属性报WMC005 自定义TypeConverter未生效
问题根因
WMC005是WinUI 3 XAML编译阶段的静态类型检查错误。System.ComponentModel.TypeConverter及对应特性是WPF/WinForms技术栈的类型转换实现,WinUI 3的XAML编译管线(负责生成XBF二进制资源的编译流程)不识别这套类型转换标注,编译阶段检索不到string到byte的对应转换逻辑时,会直接抛出属性赋值类型不匹配错误。
修复方案
无需调整现有XAML写法或业务逻辑,仅需将类型转换实现替换为WinUI原生体系下的对应实现即可:
- 引入WinUI Markup命名空间
using Microsoft.UI.Xaml.Markup; - 替换转换器基类
将FooConverter的基类从System.ComponentModel.TypeConverter替换为Microsoft.UI.Xaml.Markup.TypeConverter,仅保留字符串转byte的核心转换逻辑即可,原实现中CanConvertFrom、ConvertTo等方法属于旧类型转换器体系的成员,WinUI不会调用:public class FooConverter : TypeConverter { protected override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string text && byte.TryParse(text, out byte result)) { return result; } return base.ConvertFrom(context, culture, value); } } - 替换属性上的转换器特性
将Value属性上标注的[System.ComponentModel.TypeConverter(typeof(FooConverter))]替换为WinUI原生的Markup类型转换器特性:public class ComboBoxByteItem : MyBaseClass { private byte _value; [TypeConverter(typeof(FooConverter))] public byte Value { get => _value; set { if (_value.Equals(value)) return; _value = value; OnPropertyChanged(); } } }
补充:原属性实现中
_value != null的判断为冗余代码,byte是值类型,不存在null取值,可直接删除该判断。
修改完成后重新生成项目,WMC005错误将直接消失,XAML编译器可正确识别自定义转换逻辑,将XAML中编写的字符串格式数值转换为byte类型完成属性赋值。
内容的提问来源于stack exchange,提问作者Dominic Boexler
相关产品推荐
相关产品推荐

