2010-10-26 9 views
28

WPF è un grande set di strumenti, e l'associazione XAML è molto potente, ma spesso mi imbatto in difficoltà derivanti dalla sua trasparenza: può essere difficile eseguire il debug di un errore di associazione dati quando non vengono generati errori.Esiste un buon strumento per eseguire il debug del comportamento/degli errori del database XAML in fase di esecuzione?

Per esempio, di recente ho dovuto cambiare una dichiarazione Style come questo:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

In questa:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

Affinché la proprietà DataGridRow a essere colpiti. Sarebbe incredibilmente utile vedere, in fase di progettazione o di esecuzione, quali sarebbero le implicazioni del collegamento a fonti diverse e a RelativeSource s.

Esistono questi strumenti/tecniche?

risposta

30

È possibile utilizzare la proprietà allegata PresentationTraceSources.TraceLevel sui collegamenti per ottenere la registrazione dettagliata nell'output durante il runtime.

Nel tuo caso, sarà simile a questa:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Value="False" Binding="{Binding DataContext.TestProperty, 
        RelativeSource={RelativeSource AncestorType=UserControl}, 
        PresentationTraceSources.TraceLevel=High}"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 
+5

Questo sicuramente ha aiutato - accettato! Per completezza, dal momento che ispezionare l'albero visivo in fase di esecuzione è una preoccupazione correlata, vorrei anche sottolineare [Snoop] (http://www.blois.us/Snoop/) a chiunque non si accorga del suo fascino. –

+1

La versione più recente di Snoop può essere trovata su CodePlex: http://snoopwpf.codeplex.com/ –

+0

Mi è stato utile il corretto Tracelevel nella finestra di output. Opzioni> Debug> Finestra di output> Associazione dati. Come descritto qui: http://karlshifflett.wordpress.com/2010/06/24/visual-studio-2010-wpf-trace-settings-default-is- incorrect – uli78

3

Se si esegue l'applicazione nel debugger di Visual Studio, gli errori di associazione verranno segnalati alla finestra di output. Questi sono molto istruttivi e dovrebbero aiutarti a rintracciare eventuali errori.

4

Bea Stollnitz ha un post molto ben informato sulla debugging WPF bindings.

Se si utilizza Visual Studio 2010, è necessario update the default WPF trace setting.

+0

+1 Grazie per aver sottolineato la necessità di aggiornare l'impostazione VS2010; Mi sarei bruciato un sacco di tempo su quello. –

0

Un'altra opzione in Visual Studio 2010 consiste nel mettere un punto di interruzione sull'associazione. Questo può essere fatto facilmente facendo clic sulla parola chiave Binding e premendo F9 per impostare il punto di interruzione. La parola chiave Binding sarà evidenziata in rosso. Se una parte più grande del testo è evidenziata, è possibile che il punto di interruzione non funzioni nell'editor che si sta utilizzando. In tal caso, provare a fare clic con il pulsante destro del mouse in Esplora soluzioni, selezionare "Apri con" e scegliere "Editor codice sorgente (testo)".

Quando si raggiunge il punto di interruzione in fase di esecuzione, è possibile esaminarlo utilizzando la finestra del debugger Locals e vedere a cosa è associato.

+4

Questo non funziona per me in Visual Studio 2010: quando si visualizza un file XAML, nessuna opzione di punto di interruzione appare nel menu Debug e premendo F9 con il cursore su '{Binding ...' non ha alcun effetto. Puoi chiarire cosa stai facendo (forse con uno screenshot) per raggiungere questo obiettivo? –

Problemi correlati