Sto costruendo un menu di scelta rapida dinamico. Per realizzare ciò, ho creato un modello di visualizzazione personalizzato che rappresenta il mio menu contestuale, definito in questo modo:
public class ContextMenuVM {
public object ContextItem { get; set; }
public ObservableCollection<ICommand> Items { get; private set; }
}
La proprietà Items
contiene i comandi effettivi da mostrare nel menu di scelta rapida e nella proprietà ContextItem
contiene l'oggetto di contesto su cui questi comandi devono essere eseguiti.
Inoltre, ho una classe singleton che contiene tutti i miei vari comandi e la loro implementazione. Quindi alla fine ci sarà un metodo che verrà chiamato UpdateContextMenu
sul viewmodel che possiede il menu contestuale che fa qualcosa del genere:
ContextMenu.Items.Clear();
ContextMenu.Items.Add(SingletonClass.Instance.CommandA);
if (condition)
ContextMenu.Items.Add(SingletonClass.Instance.CommandB);
Il ContextMenu in XAML è definito in questo modo:
<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<ContentControl>
<MenuItem Command="{Binding}" CommandParameter="what-goes-here?" />
</ContentControl>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
Quello che non riesco a ottenere è ottenere il CommandParameter
vincolante al lavoro. Come dovrei legarmi al ContextItem
proprietà del ContextMenuVM
esempio?
risposte:
0 per risposta № 1Senza un bene Esempio di codice minimo, completo e verificabile quello mostra chiaramente quello che stai facendo, è impossibile saperlo con certezza. Ma sulla base delle informazioni che hai fornito finora, sembra che tu stia cercando il RelativeSource
fonte vincolante. Per esempio.:
<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>
Ho dovuto indovinare il percorso di rilegatura, basato sul tuo ItemsSource
vincolante, perché il tuo esempio di codice originale non è completo. L'idea di base è quella di collegarsi a un percorso che è relativo alla sorgente specificata, quindi ho assunto che il ContextMenu
si riferisce a una proprietà che restituisce il ContextMenuVM
oggetto che stai usando.
Se questo non risolve la tua domanda, ti preghiamo di migliorarla fornendo un buon MCVE.