2 Stimmen

Wie binden Sie Menüpunkte an ein ContextMenu in Silverlight, einschließlich des Symbols?

Ich habe ein Kontextmenü und ich möchte, dass seine Menüelemente über eine Bindung aufgefüllt werden. Der folgende Code funktioniert

aber es gibt ein Problem, das ItemTemplate repräsentiert den Textbereich eines Menüelements und erlaubt es meiner Meinung nach nicht, das Symbol festzulegen

also habe ich versucht, die Bindung über den ItemContainerStyle wie im folgenden Beispiel zu machen

                    <Setter Property="Header" Value="{Binding Name}"/>

aber Silverlight scheint das nicht zu mögen

Irgendwelche Ideen?

0voto

Erik Noren Punkte 4229

Ich erstelle ein Kontextmenü programmgesteuert und das Setzen des Inhalts auf die MenuItem.Header-Eigenschaft scheint bei Bildern einwandfrei zu funktionieren. Es gibt viele Beispiele zum Setzen von Text.

0voto

Ziad Punkte 1016

Versuchen Sie stattdessen dieses Open-Source-Menü:

http://sl4popupmenu.codeplex.com

Die Vorlage ermöglicht die direkte Bindung von Bildern. Hoffentlich hilft das.

0voto

kbrimington Punkte 24546

Ich hatte die gleiche Frage und obwohl ich nicht die Antwort fand, die ich wollte, fand ich einen Workaround, der meinen Bedürfnissen gut entsprach. Ich dachte, du würdest es gerne sehen, auch lange danach.

Anscheinend, wenn die ItemsSource der Klasse ContextMenu MenuItem-Objekte enthält, landet das Symbol dort, wo es hingehört. Ich habe, wie du, ein ViewModel verwendet und wollte keine UI-Logik in meine ViewModel-Klasse einfügen.

Stattdessen habe ich einen Wertkonverter implementiert, um mein ViewModel in MenuItem-Objekte zu transformieren. Es sah ungefähr so aus:


XAML:

...

C#-Code-Behind

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items;
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}

Discussion

Der DelegatedValueConverter ist etwas, das ich detailliert hier beschreibe, aber es ist nicht wirklich wichtig. Du könntest deinen eigenen Wertkonverter erstellen und stattdessen verwenden.

Die Eigenschaft Title meines ViewModels ist ein String und Icon ist eine Instanz von Image. Ich benutze die Tag-Eigenschaft des Menüobjekts, um eine Referenz auf mein ViewModel zu behalten, damit ich mich während eines Klickereignisses auf die nicht-visuellen Daten darin beziehen kann.

Diese Lösung ist bequem, weil sie immer noch eine Trennung zwischen der UI und dem ViewModel bietet, obwohl ich in diesem Fall eine rein deklarative Lösung bevorzugen würde.

Ich hoffe, das hilft!

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