【发布时间】:2020-10-28 17:31:51
【问题描述】:
我已经定义了一个枚举类型,详细说明了用于为灰度图像着色的各种调色板,为此我使用了描述属性和一个 TypeConverter,以便使用我正在绑定的组合框、列表框等的枚举值的描述字符串到这种类型。枚举看起来像这样:
// available color palettes for colorizing 8 bit grayscale images
[TypeConverter(typeof(EnumDescriptionTypeConverter))]
public enum ColorPalette
{
[Description("Alarm Blue")]
AlarmBlue,
[Description("Alarm Blue High")]
AlarmBlueHi,
[Description("Alarm Green")]
AlarmGreen,
[Description("Alarm Red")]
AlarmRed,
[Description("Fire")]
Fire,
[Description("Gray BW")]
GrayBW,
[Description("Ice 32")]
Ice32,
[Description("Iron")]
Iron,
[Description("Iron High")]
IronHi,
[Description("Medical 10")]
Medical10,
[Description("Rainbow")]
Rainbow,
[Description("Rainbow High")]
RainbowHi,
[Description("Temperature 256")]
Temperature256,
[Description("Nano Green")]
NanoGreen
};
EnumDescriptionTypeConverter 如下所示:
public class EnumDescriptionTypeConverter : EnumConverter
{
public EnumDescriptionTypeConverter(Type type) : base(type) { }
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
if (value != null)
{
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
if (fieldInfo != null)
{
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
return ((attributes.Length > 0) && (!string.IsNullOrEmpty(attributes[0].Description))) ? attributes[0].Description : value.ToString();
}
}
return string.Empty;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
使用它,我可以将枚举类型绑定为组合框的 ItemsSource 属性,并使用另一个自定义标记扩展类自动将描述字符串用作组合框元素,我不相信它的代码是在这里相关。 问题是,如果我尝试在基于此枚举类型的自定义控件上创建公共依赖属性,它将不起作用。这是一个示例自定义控件:
public class TestControl : Control
{
public ColorPalette Test1
{
get => (ColorPalette)GetValue(Test1Property);
set => SetValue(Test1Property, value);
}
public static readonly DependencyProperty Test1Property = DependencyProperty.Register(nameof(Test1), typeof(ColorPalette),
typeof(TestControl), new PropertyMetadata
{
DefaultValue = ColorPalette.Rainbow
});
}
此代码编译没有错误,我可以将 TestControl 放入一个窗口,直到我尝试在 XAML 中设置测试属性的值 - 然后我没有得到包含枚举值的通常 IntelliSense,当我尝试无论如何手动设置一个值,当我运行应用程序时,我得到一个访问冲突异常,就在 MainWindow 的 InitializeComponent() 方法:
" 在 .exe 中的 0x00007FF84723A799 (KernelBase.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000008。发生“
当我从枚举定义中删除 TypeConverter 属性时不会发生这种情况,但是当然描述字符串绑定不再起作用。
我对 WPF 的了解还不够,无法意识到问题到底出在哪里。有没有办法避免这种情况,并且仍然使用 TypeConverter 来使用 Description 字符串属性进行绑定?
【问题讨论】:
标签: c# wpf enums dependency-properties typeconverter