c# 将对象转换为枚举不起作用
c# Casting object to enum wont work
我知道了 xaml:
<Grid Background="{Binding Source=Typ, Converter={StaticResource ColorConv}}">
Typ 是一个枚举,这个:
public enum LogEintragTyp { Debug, Fehler, Debug2, Warnung, Analyse, User }
我有一个转换器可以将该类型转换为颜色。这是其中的一部分:
[ValueConversion(typeof(LogEintragTyp), typeof(Color))]
public class LogTypToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value.GetType() == typeof(LogEintragTyp)))
throw new Exception("Wrong type!");
LogEintragTyp sv = (LogEintragTyp)value;
绑定到此模板的对象总是 "LogEintragTyp" 值。但是它总是在那里抛出异常。
当我在 Visual Studio 中调试它时,它说 "value" 是这样的:
所以它说 "value" 包含 "Typ"。
但是,当我在鼠标悬停时从调试器中查看正确转换的值时,它说这个(在底部):
"Debug" 这是我正在寻找的值...但是当我将调试器移动到该行以实际让程序执行转换时,它说无效的强制转换异常。为什么 "value" 对象中没有 "LogEintragTyp" 而字符串 "Typ" 是我实际要查找的值的名称并且调试器也看到了但执行程序不是?
正如评论所指出的,您的 value
是一个字符串。试试这个:
LogEintragTyp result;
if (Enum.TryParse((string)value, true, out result))
{
return some color based on 'result';
}
return something else;
编辑
考虑到初衷,@Clemens 的回答显然是正确的。但是,如果您想显示来自 XAML 的硬编码值,使用 Source=some-string
是一种方法,只需对转换器进行上述更改。但是,不完全是类型安全的。您还可以使用实际的枚举成员,如下所示:
public enum LogType { Good, Bad, Ugly }
XAML:
<Window
x:Class="WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF">
<StackPanel>
<StackPanel.Resources>
<local:LogTypeToColorConverter x:Key="Converter" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="50" />
<Setter Property="Height" Value="20" />
</Style>
</StackPanel.Resources>
<Rectangle Fill="{Binding Source={x:Static local:LogType.Good}, Converter={StaticResource Converter}}" />
<Rectangle Fill="{Binding Source={x:Static local:LogType.Bad}, Converter={StaticResource Converter}}" />
<Rectangle Fill="{Binding Source={x:Static local:LogType.Ugly}, Converter={StaticResource Converter}}" />
</StackPanel>
</Window>
Convert
方法:
if (value.GetType() != typeof(LogType))
throw new Exception("Wrong type!");
switch ((LogType)value)
{
case LogType.Good: return Brushes.Green;
case LogType.Bad: return Brushes.Red;
case LogType.Ugly: return Brushes.Orange;
default: return Brushes.Black;
}
...结果是这样的:
显然你想绑定到某个对象的 Typ
属性,所以你的绑定应该使用 Path
而不是 Source
:
<Grid Background="{Binding Path=Typ, Converter={StaticResource ColorConv}}">
或者
<Grid Background="{Binding Typ, Converter={StaticResource ColorConv}}">
我知道了 xaml:
<Grid Background="{Binding Source=Typ, Converter={StaticResource ColorConv}}">
Typ 是一个枚举,这个:
public enum LogEintragTyp { Debug, Fehler, Debug2, Warnung, Analyse, User }
我有一个转换器可以将该类型转换为颜色。这是其中的一部分:
[ValueConversion(typeof(LogEintragTyp), typeof(Color))]
public class LogTypToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value.GetType() == typeof(LogEintragTyp)))
throw new Exception("Wrong type!");
LogEintragTyp sv = (LogEintragTyp)value;
绑定到此模板的对象总是 "LogEintragTyp" 值。但是它总是在那里抛出异常。
当我在 Visual Studio 中调试它时,它说 "value" 是这样的:
所以它说 "value" 包含 "Typ"。 但是,当我在鼠标悬停时从调试器中查看正确转换的值时,它说这个(在底部):
"Debug" 这是我正在寻找的值...但是当我将调试器移动到该行以实际让程序执行转换时,它说无效的强制转换异常。为什么 "value" 对象中没有 "LogEintragTyp" 而字符串 "Typ" 是我实际要查找的值的名称并且调试器也看到了但执行程序不是?
正如评论所指出的,您的 value
是一个字符串。试试这个:
LogEintragTyp result;
if (Enum.TryParse((string)value, true, out result))
{
return some color based on 'result';
}
return something else;
编辑
考虑到初衷,@Clemens 的回答显然是正确的。但是,如果您想显示来自 XAML 的硬编码值,使用 Source=some-string
是一种方法,只需对转换器进行上述更改。但是,不完全是类型安全的。您还可以使用实际的枚举成员,如下所示:
public enum LogType { Good, Bad, Ugly }
XAML:
<Window
x:Class="WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF">
<StackPanel>
<StackPanel.Resources>
<local:LogTypeToColorConverter x:Key="Converter" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="50" />
<Setter Property="Height" Value="20" />
</Style>
</StackPanel.Resources>
<Rectangle Fill="{Binding Source={x:Static local:LogType.Good}, Converter={StaticResource Converter}}" />
<Rectangle Fill="{Binding Source={x:Static local:LogType.Bad}, Converter={StaticResource Converter}}" />
<Rectangle Fill="{Binding Source={x:Static local:LogType.Ugly}, Converter={StaticResource Converter}}" />
</StackPanel>
</Window>
Convert
方法:
if (value.GetType() != typeof(LogType))
throw new Exception("Wrong type!");
switch ((LogType)value)
{
case LogType.Good: return Brushes.Green;
case LogType.Bad: return Brushes.Red;
case LogType.Ugly: return Brushes.Orange;
default: return Brushes.Black;
}
...结果是这样的:
显然你想绑定到某个对象的 Typ
属性,所以你的绑定应该使用 Path
而不是 Source
:
<Grid Background="{Binding Path=Typ, Converter={StaticResource ColorConv}}">
或者
<Grid Background="{Binding Typ, Converter={StaticResource ColorConv}}">