Errore WPF: imansible trovare Governance FrameworkElement per l’elemento di destinazione

Ho un datagrid con una riga che ha un’immagine. Questa immagine è associata a un trigger per un determinato stato. Quando lo stato cambia, voglio cambiare l’immagine.

Il modello stesso è impostato su HeaderStyle di DataGridTemplateColumn. Questo modello ha alcuni vincoli. Il primo Giorno vincolante mostra che giorno è e lo Stato cambia l’immagine con un grilletto.

Queste proprietà sono impostate in un ViewModel.

Proprietà:

public class HeaderItem { public string Day { get; set; } public ValidationStatus State { get; set; } } this.HeaderItems = new ObservableCollection(); for (int i = 1; i < 15; i++) { this.HeaderItems.Add(new HeaderItem() { Day = i.ToString(), State = ValidationStatus.Nieuw, }); } 

datagrid:

               

Datagrid HeaderStyleTemplate:

                           

Ora quando avvio il progetto le immagini non vengono visualizzate e ottengo questo errore:

Errore System.Windows.Data: 2: Imansible trovare il framework FrameworkElement o FrameworkContentElement per l’elemento di destinazione. BindingExpression: Path = HeaderItems [0]; DataItem = null; l’elemento di destinazione è ‘DataGridTemplateColumn’ (HashCode = 26950454); la proprietà target è “Intestazione” (digita “Oggetto”)

Perché viene mostrato questo errore?

Purtroppo qualsiasi DataGridColumn ospitato in DataGrid.Columns non fa parte dell’albero di Visual e pertanto non è connesso al contesto dati del datagrid. Quindi i binding non funzionano con le loro proprietà come Visibility o Header ecc (sebbene queste proprietà siano proprietà di dipendenza valide!).

Ora potresti chiedermi come è ansible? La loro proprietà Binding non dovrebbe essere legata al contesto dei dati? Beh, è ​​semplicemente un hack. L’associazione non funziona davvero. In realtà sono le celle datagrid che copiano / clonano questo object vincolante e lo usano per mostrare i propri contenuti!

Quindi, ora tornando a risolvere il problema, presumo che HeaderItems sia una proprietà dell’object impostata come DataContext della vista padre. Possiamo colbind DataContext della vista a qualsiasi DataGridColumn tramite qualcosa che chiamiamo ProxyElement .

L’esempio seguente illustra come colbind un figlio logico come ContextMenu o DataGridColumn al DataContext della genitore View

                           

La vista precedente ha riscontrato lo stesso errore di associazione che hai trovato se non avessi implementato l’hack ProxyElement. ProxyElement è qualsiasi FrameworkElement che ruba DataContext dalla vista principale e lo offre al figlio logico come ContextMenu o DataGridColumn . Per questo deve essere ospitato come Content in un ContentControl invisibile che si trova sotto la stessa vista.

Spero che questo ti guidi nella giusta direzione.