Ich habe eine Eigenschaft vom Typ object
die eine Enum
Wert, und wenn ich ihn mit (int)value
gibt es eine string
des Namens der Enum. Warum?
Der Code, bei dem mir dies aufgefallen ist, befindet sich in diese Antwort . Verwendung von Convert.ToInt32()
wirft korrekt die Enum
zu einer int
aber ich war nur neugierig, warum ich einen String zurückbekomme, wenn ich (int)
. Es wird nicht einmal eine Fehlermeldung ausgegeben.
bearbeiten
Hier ist ein kurzes Beispiel. Ich habe kommentiert, wo ich den Haltepunkt gesetzt habe, und habe das unmittelbare Fenster verwendet, um festzustellen, was die Ausgabe war.
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public Int32 SomeNumber { get; set; }
public MainWindow()
{
InitializeComponent();
SomeNumber = 1;
RootWindow.DataContext = this;
}
}
public enum MyEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
/// <summary>
/// Returns true if the int value equals the Enum parameter, otherwise returns false
/// </summary>
public class IsIntEqualEnumParameterConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter == null || value == null) return false;
if (parameter.GetType().IsEnum && value is int)
{
// Breakpoint here
return (int)parameter == (int)value;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
MainWindow.xaml
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication5"
Title="MainWindow" Height="350" Width="525"
x:Name="RootWindow">
<Window.Resources>
<local:IsIntEqualEnumParameterConverter x:Key="IsIntEqualEnumParameterConverter" />
</Window.Resources>
<StackPanel>
<TextBlock Text="{Binding SomeNumber, Converter={StaticResource IsIntEqualEnumParameterConverter}, ConverterParameter={x:Static local:MyEnum.Value1}}" />
</StackPanel>
</Window>
Bearbeiten #2
Ich hoffe nur, dass ich einige Unklarheiten beseitigen kann...
Ich sagte, dass es eine Zeichenkette zurückgibt, weil die Ausführung ?((int)parameter)
im Sofort-Fenster gab den Enum-Namen zurück, während die ?System.Convert.ToInt32(parameter)
den Wert int korrekt anzeigt.
Im Nachhinein stellte ich fest, dass der DataTrigger die ganze Zeit über korrekt ausgewertet wurde. Ich dachte, dass es nicht daran lag, dass mein Steuerelement zur Laufzeit nicht sichtbar war, aber ich entdeckte, dass dies an einem Fehler in meiner XAML lag (ich vergaß ein Grid.Column
Eigenschaft, so dass sich ein Steuerelement mit einem anderen überlappt).
Entschuldigung für die verwirrende Frage.
Bearbeiten #3
Hier ist einige Konsole app Code demonstriert die Situation nur für Jon :)
class Program
{
static void Main(string[] args)
{
object value;
value = Test.Value1;
// Put breakpoint here
// Run ?(int)value vs Convert.ToInt32(value) in the immediate window
// Why does the first return Value1 while the 2nd returns 1?
Console.ReadLine();
}
}
public enum Test
{
Value1 = 1
}