Associazione di RelativeSource da una descrizione comando o ContextMenu

Cosa sto facendo di sbagliato qui ?:

   

Questo è solo un esempio semplificato, che non funziona comunque 🙂 In realtà ho bisogno di ottenere un valore da un’altra proprietà che rientra nell’ambito DataContext di Windows.

Aiutami, pls.

Questo è difficile perché ToolTip non fa parte di VisualTree. Qui puoi vedere una soluzione interessante per lo stesso problema con ContextMenus. Allo stesso modo puoi andare per la descrizione.

AGGIORNARE
Purtroppo il collegamento è scomparso e non ho più trovato l’articolo di riferimento.
Per quanto mi ricordo, il blog di riferimento ha mostrato come associare a un DataContext di un altro VisualTree, che è spesso necessario quando si esegue il binding da una descrizione comando, un ContextMenu o un Popup.

Un buon modo per farlo è fornire l’istanza desiderata (ad es. ViewModel) all’interno della proprietà Tag di PlacementTarget. Il seguente esempio lo fa per accedere a un’istanza di comando di un ViewModel:

  

Non l’ho testato e è da tanto che l’ho fatto l’ultima volta. Si prega di fare un commento se non funziona per voi.

AGGIORNAMENTO 2

Dato che il link originale su cui questa risposta è stata scritta è andato, ho trovato archive.org e ho trovato la voce originale del blog . Eccolo, letteralmente dal blog:

Poiché un ContextMenu in WPF non esiste all’interno dell’albero visivo della pagina / finestra / controllo di per sé, l’associazione dei dati può essere un po ‘complicata. Ho cercato in alto e in basso in tutto il web per questo, e la risposta più comune sembra essere “basta farlo nel codice dietro”. SBAGLIATO! Non sono entrato nel meraviglioso mondo di XAML per tornare a fare le cose nel codice.

Ecco il mio esempio che ti permetterà di bind a una stringa che esiste come una proprietà della tua finestra.

 public partial class Window1 : Window { public Window1() { MyString = "Here is my string"; } public string MyString { get; set; } }  

La parte importante è il Tag sul pulsante (anche se è ansible impostare facilmente DataContext del pulsante). Questo memorizza un riferimento alla finestra genitore. ContextMenu è in grado di accedervi tramite la proprietà PlacementTarget. È quindi ansible passare questo contesto verso il basso attraverso le voci del menu.

Ammetto che questa non è la soluzione più elegante del mondo. Tuttavia, batte il roba di impostazione nel codice dietro. Se qualcuno ha un modo ancora migliore per farlo, mi piacerebbe sentirlo.

Per quanto segue:
PlacementTarget è il controllo proprietario di ContextMenu (ad esempio: DataGrid). Non c’è bisogno di una proprietà “tag”.

IsEnabled si collega al valore “myProperty” del DataGrid.

Ho provato questo e funziona. Stavo avendo un problema simile con il binding.

  

Poiché ContextMenu non è nella struttura visiva, il binding non funzionerà. una soluzione semplice utilizza Proxy Pattern, puoi creare una class wrapper che eredita da DependencyObject e ha una DependencyProperty che manterrà un DataContext della tua Window , quindi puoi avere una risorsa del proxy in XAML e infine associare il comando MenuItem al tuo comando desiderato tramite l’object proxy.
Proxy di esempio:

 Public class ProxyClass : DependencyObject { Public object Data {get; set;} public static readonly DependencyProperty DataProperty = DependencyProperty.Register("DataProperty", typeof(object), typeof(ProxyClass), new FrameworkPropertyMetadata(null)); } 

Come utilizzare in XAML:

  ...    ...  ...  

Che cosa sta succedendo?
Data proprietà Data di ProxyClass si associa a DataContext di Window , quindi contiene tutte le proprietà e le proprietà di ViewModel all’interno della risorsa ProxyClass .
un altro vantaggio di questo approccio è la portabilità e il riutilizzo in più viste e progetti.

Penso che dovrebbe essere fatto in questo modo:

 {Binding Path=Title, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"