/// <summary> /// Quando viene disegnato il menu contestuale per la prima volta, /// devo fare una operazione che da XAML non si riesce. /// Ovvero devo creare le voci di menu nel menu "padre" rispetto al sottomenu che si riesce a creare /// nello xaml. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> void onMenuItemStampePieneUpdated(object sender, DataTransferEventArgs args) { MenuItem menuItemStampePiene = (MenuItem)sender; MenuItem menuItemSingolaFoto = (MenuItem)menuItemStampePiene.Parent; SelettoreAzioneRapidaViewModel vm = (SelettoreAzioneRapidaViewModel)menuItemStampePiene.DataContext; if (vm == null) { // Questa cosa non ha senso, perché il VM dovrebbe essere sempre valorizzato #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debugger.Break(); } #endif vm = azioniRapideViewModel; } if (vm == null) { _giornale.Warn("data context vuoto per menu contestuale. Come mai ?"); } else { if (menuItemStampePiene.HasItems) { int conta = 0; foreach (var item in menuItemStampePiene.Items) { // Creo una nuova voce di menu MenuItem newItem = new MenuItem(); newItem.DataContext = vm; StampanteAbbinata cartaStampabile = (StampanteAbbinata)item; // bindo il comando di stampa newItem.Command = vm.stampaRapidaCommand; newItem.CommandParameter = cartaStampabile; newItem.Header = cartaStampabile.ToString(); Uri uri = new Uri("/Resources/Printer-16x16.ico", UriKind.Relative); newItem.Icon = new System.Windows.Controls.Image { Source = new BitmapImage(uri), ToolTip = "Stampa immediata a formato pieno" }; // Inserisco l'elemento appena creato, nel menu superiore. ((MenuItem)menuItemStampePiene.Parent).Items.Insert(conta++, newItem); } // Ora che ho aggiunto tutte le voci al menu superiore, rimuovo il sottomenu che risulterebbe un doppione. menuItemSingolaFoto.Items.Remove(menuItemStampePiene); } } }
public void azioniRapideMenu_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { // Questa operazione non dovrebbe servire ContextMenu menu = (ContextMenu)sender; azioniRapideViewModel = (SelettoreAzioneRapidaViewModel)menu.DataContext; if (azioniRapideViewModel == null) { _giornale.Warn("DataContext nullo"); #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debugger.Break(); } #endif } }
private void onSubmenuOpened(object sender, RoutedEventArgs e) { MenuItem curr = (MenuItem)sender; SelettoreAzioneRapidaViewModel vm = (SelettoreAzioneRapidaViewModel)curr.DataContext; if (vm != null) { vm.setTarget((string)curr.Tag); } else { // Impossibile !!! QUI NON DOVREBBE MAI CADERE (invece succede) // Non so perché ma il menu contestuale che appare con il tasto destro, a volte // perde il datacontext e quindi non sono più in grado di eseguire l'azione corrispondente. // In questo caso, occorre uscire dal programma _giornale.Error("ContextMenu ha perso il DataContext. Non riesco bindare il datacontext"); } }