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