2016-10-11 5 views
-1

Ich baue ein dynamisches Kontextmenü. Um das zu erreichen habe ich mit einem benutzerdefinierten Ansichtsmodell kommen, dass mein contextmenu darstellt, wie folgt definiert:CommandParameter an Eigenschaft des besitzenden Objekts binden

public class ContextMenuVM { 
    public object ContextItem { get; set; } 
    public ObservableCollection<ICommand> Items { get; private set; } 
} 

Die Eigenschaft Items die effektiven Befehle hält in der contextmenu zu zeigen und die Eigenschaft ContextItem die kontext Artikel besagt, dass Diese Befehle sollen ausgeführt werden.

Weiterhin habe ich eine Singleton-Klasse, die alle meine verschiedenen Befehle und ihre Implementierung enthält. Also am Ende wird ein Verfahren sein, das UpdateContextMenu auf dem Viewmodel aufgerufen wird, der die contextmenu besitzt, die so etwas wie dies funktioniert:

ContextMenu.Items.Clear(); 
ContextMenu.Items.Add(SingletonClass.Instance.CommandA); 
if (condition) 
    ContextMenu.Items.Add(SingletonClass.Instance.CommandB); 

Die ContextMenu iteself in XAML wie folgt definiert ist:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}"> 
    <ContextMenu.ItemTemplate> 
    <DataTemplate> 
     <ContentControl> 
     <MenuItem Command="{Binding}" CommandParameter="what-goes-here?" /> 
     </ContentControl> 
    </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

Was ich nicht erreichen kann, ist die CommandParameter Bindung zu arbeiten. Wie soll ich an die ContextItem Eigenschaft der ContextMenuVM Instanz binden?

Antwort

0

Ohne eine gute Minimal, Complete, and Verifiable code example, die deutlich zeigt, was Sie tun, ist es unmöglich, sicher zu wissen. Aber basierend auf den Informationen, die Sie bisher angegeben haben, scheint es, als ob Sie nach der RelativeSource Bindungsquelle suchen. Z.B .:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}"> 
    <ContextMenu.ItemTemplate> 
    <DataTemplate> 
     <ContentControl> 
     <MenuItem Command="{Binding}" 
        CommandParameter="{Binding ContextMenu.ContextItem 
         RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> 
     </ContentControl> 
    </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

Ich hatte eine Vermutung, die Bindung Weg zu machen, basierend auf Ihrer ItemsSource Bindung, weil Ihr ursprüngliches Codebeispiel nicht abgeschlossen ist. Die Grundidee besteht darin, an einen Pfad zu binden, der relativ zur angegebenen Quelle ist. Daher habe ich davon ausgegangen, dass sich ContextMenu auf eine Eigenschaft bezieht, die das ContextMenuVM-Objekt zurückgibt, das Sie verwenden.

Wenn dies Ihre Frage nicht anspricht, verbessern Sie sie bitte mit einem guten MCVE.

Verwandte Themen