/ / Collega CommandParameter alla proprietà di possedere un oggetto - c #, wpf, xaml

Collega CommandParameter alla proprietà di possedere un oggetto - c #, wpf, xaml

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 № 1

Senza 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.