2016-12-15 5 views
1

Я получил этот код XAML:с объектом # Кастинг для ENUM не будут работать

<Grid Background="{Binding Source=Typ, Converter={StaticResource ColorConv}}"> 

Typ является Enum, этот:

public enum LogEintragTyp { Debug, Fehler, Debug2, Warnung, Analyse, User } 

У меня есть конвертер, который преобразует этот тип в цвет. Heres часть его:

[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 он говорит: "значение" заключается в следующем:

Wrong Type

Так он говорит: "значение" содержит "Typ". Но когда я смотрю на из отладчика при наведении курсора мыши правильно литым значение он говорит, что это (в нижней части):

enter image description here

«Debug», который является значением, которое я искал ... Но когда Я перемещаю отладчик в эту строку, чтобы на самом деле позволить программе выполнить преобразование, это говорит о недопустимом исключении литья. Почему в объекте «значение» нет «LogEintragTyp», но строка «Typ», которая является именем значения, которое я действительно ищу, и отладчик также видит, но исполняющая программа isnt?

+3

вы не можете боксировать отливать строку в перечисление вам нужно использовать Enum.TryParse –

+2

Похоже, что 'value' является' string'. И 'sv' просто показывает вам значение по умолчанию, прежде чем оно будет установлено приложением в отладчике. – juharr

+1

Когда вы пишете '{Binding Source = Typ, ...}' исходный объект привязки - это просто строка '' Typ "'. Вероятно, вы хотите связать какой-то объект с общедоступным свойством «Typ» и написать Binding следующим образом: '{Binding Path = Typ, ...}' или просто '{Binding Typ, ...}'. – Clemens

ответ

1

Видимо, вы хотите связать с Typ свойство какого-либо объекта, так что ваши привязки должны использовать Path вместо Source:

<Grid Background="{Binding Path=Typ, Converter={StaticResource ColorConv}}"> 

Или

<Grid Background="{Binding Typ, Converter={StaticResource ColorConv}}"> 
1

Как указано в комментариях, ваш value - это строка. Попробуйте это:

LogEintragTyp result; 
if (Enum.TryParse((string)value, true, out result)) 
{ 
    return some color based on 'result'; 
} 

return something else; 

EDIT

Ответ от @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; 
} 

... который заканчивается так:

enter image description here

+0

Фактическая проблема заключается не в том, что значение, созданное Binding, является строкой и должно быть проанализировано ('Typ' даже не является значением перечисления), но это неверное выражение привязки. – Clemens

+0

Да, это, клемены. – Ravior