3 Stimmen

ComboBox von Typen mit einem ValueConverter und benutzerdefinierten Attributen

Ich verwende MVVM, falls es einen Unterschied macht.

Meine MainWindowViewModel hat zwei DependencyProperties, DieListe y TheSelectedItem . DieListe ist eine Liste<Typ> , TheSelectedItem ist eine Typ .

Das MainWindow hat eine ComboBox . Wenn die MainWindowViewModel lädt, wird eine Liste aller Klassen in der Assembly erstellt, die Folgendes implementieren IMyInterface und setzt DieListe dazu.

Jede dieser Klassen hat ein benutzerdefiniertes Attribut, das AnzeigeName die einen Parameter hat, der verwendet wird, um einen benutzerfreundlichen Namen für die Klasse anstelle des Namens, den die Anwendung für die Klasse kennt, anzuzeigen.

Ich habe auch eine Wertkonverter für den ausdrücklichen Zweck, diese Typen in die Anzeigenamen umzuwandeln.

    public class TypeToDisplayName : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType.Name == "IEnumerable")
            {
                List<string> returnList = new List<string>();
                if (value is List<Type>)
                {
                    foreach (Type t in value as List<Type>)
                    {
                        returnList.Add(ReflectionHelper.GetDisplayName(t));
                    }
                }

                return returnList;
            }
            else
            {
                throw new NotSupportedException();
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return typeof(BasicTemplate);
        }
    }

Am Ende habe ich also eine ComboBox mit einer Liste von Namen, die für den Benutzer verständlich sein sollten. Fantastisch! Das ist genau das, was ich will!

Nächster Schritt: Ich binde die SelectedItem-Eigenschaft meiner ComboBox zu meinem TheSelectedItem Eigenschaft in meinem ViewModel.

Hier ist das Problem: Wenn ich eine Auswahl treffe, erhalte ich einen kleinen roten Kasten um meine ComboBox und die TheSelectedItem Eigenschaft auf meinem ViewModel wird nie festgelegt.

Ich bin mir ziemlich sicher, dass es an einer Fehlanpassung des Typs liegt (die Elemente in der ComboBox scheinen jetzt Strings zu sein, und TheSelectedItem ist vom Typ Typ --auch, wenn ich die TheSelectedItem zu einer cadena anstelle einer Typ es funktioniert). Aber ich weiß nicht, wo ich mit der Codierung beginnen muss, um den (hoffentlich eindeutigen) DisplayName zu konvertieren, der in der ComboBox zurück in ein Type-Objekt ist.

Vielen Dank im Voraus für jede Hilfe. Ich bin ziemlich verblüfft über diese ein.

9voto

Fredrik Hedblad Punkte 81655

Wenn ich Ihre Frage richtig verstehe, dann verwenden Sie diesen Konverter auf die ItemsSource für die ComboBox? In diesem Fall denke ich, dass Sie die ItemsSource lassen können, wie es ist und stattdessen nur konvertieren jeden Typ, wenn sie wie diese präsentiert werden.

<ComboBox ...>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=typeName, Converter={StaticResource TypeToDisplayNameConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Und dann konvertieren Sie einfach jeden Typ im Konverter.

public class TypeToDisplayNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type t = (Type)value;
        return ReflectionHelper.GetDisplayName(t);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}

1voto

Aaron McIver Punkte 24151

Stellen Sie sicher, dass Sie IsSynchronizedWithCurrentItem auf true gesetzt auf der ComboBox . Siehe este aus...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X