2016-12-15 8 views
1

文句を言わない作業を列挙します色。C#のキャストオブジェクトは、私は、このXAMLを持って

[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」値です。ただし、常に例外がスローされます。

Wrong Type

だから、 "値" は "標準" を含んで言う:私は、Visual Studioでこれをデバッグするとき

それは "値が" これですと言います。 しかし、私はマウスオーバー正しくキャスト値上のデバッガから見たときに、それは(一番下)これを言う:

enter image description here

私が探しています値である「デバッグ」...しかしときデバッガをその行に移動して、実際にプログラムが変換を実行できるようにすると、無効なキャスト例外が発生します。どうして "値"オブジェクトに "LogEintragTyp"という文字列がありませんが、実際に探している値の名前である文字列 "Typ"とデバッガも見ていますが、実行中のプログラムはisntですか?

+3

あなたが列挙型に文字列をキャストボックスすることはできませんEnumを使用する必要があります。TryParse –

+2

'value'は' string'のようです。 'sv'は、キャストによって設定される前のデフォルト値をデバッガで表示しています。 – juharr

+1

'{Binding Source = Typ、...}'と書くと、バインディングのソースオブジェクトは文字列 '' Typ "'になります。おそらく、パブリック 'Typ'プロパティを持つオブジェクトにバインドし、' {Binding Path = Typ、...} 'や' {Binding Typ、...} 'のようにBindingを書くことをお勧めします。 – Clemens

答えて

1

どうやらあなたのバインディングではなくSourcePathを使用する必要がありますので、いくつかのオブジェクトのTypプロパティにバインドする:

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

それとも

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

コメントが指摘したように、valueは文字列です。 @Clemensからの答えは本来の意図を考えると、明らかに正しいものである

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

return something else; 

EDIT

:これを試してみてください。しかし、ハードコードされた値をXAMLから表示する場合は、上記の変更を加えてSource=some-stringを使用する方法の1つです。しかし、正確に型セーフではありません。次のようにも、実際の列挙型のメンバーを使用することができます。

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

関連する問題