72 votes

Comment détecter une liaison de données WPF cassée?

Tout en essayant de répondre à une question dans le voisinage"de l'Unité de Test WPF Liaisons"j'ai eu la suivante tatillonne question..
Quelle est la meilleure façon de savoir si vous avez la Liaison de Données WPF câblage de l'installation incorrecte (ou vous avez juste cassé quelque chose qui a été câblé correctement) ?

Bien que les tests unitaires approche semble être comme Joel s 'arrachant le bras pour retirer une écharde'.. je suis à la recherche autour pour le plus facile, moins de frais Généraux les moyens de le détecter.

Tout le monde semble avoir commis eux-mêmes à la liaison de données dans une grande manière avec WPF.. et il a ses mérites.

71voto

Enrico Campidoglio Points 17157

Dans .NET 3.5, un nouveau moyen de générer des informations de traçage sur des liaisons de données spécifiques a été introduit.

Cette opération est effectuée via la nouvelle propriété attachée System.Diagnostics.PresentationTraceSources.TraceLevel que vous pouvez appliquer à toute liaison ou à tout fournisseur de données. Voici un exemple:

 <Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="Debug Binding Sample"
    Height="300"
    Width="300">
    <StackPanel>
        <TextBox Name="txtInput" />
        <Label>
            <Label.Content>
                <Binding ElementName="txtInput"
                         Path="Text"
                         diag:PresentationTraceSources.TraceLevel="High" />
            </Label.Content>
        </Label>
    </StackPanel>
</Window>
 

Cela mettra les informations de trace pour cette liaison particulière dans la fenêtre de sortie de Visual Studio, sans aucune configuration de trace requise.

40voto

Gishu Points 59012

Le mieux que j'ai pu trouver...

Comment puis-je debug WPF Liaisons? par Beatriz Stollnitz

Puisque tout le monde ne peut pas toujours garder un œil sur la Fenêtre de Sortie à la recherche pour la Liaison des erreurs, j'ai adoré l'Option n ° 2. Ce qui est de l'ajouter à votre Application.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.Windows.Data" switchName="SourceSwitch" >
        <listeners>
          <add name="textListener" />
        </listeners>
      </source>

    </sources>
      <switches>
        <add name="SourceSwitch" value="All" />
      </switches>

      <sharedListeners>
        <add name="textListener"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="GraveOfBindErrors.txt" />
      </sharedListeners>

      <trace autoflush="true" indentsize="4"></trace>

  </system.diagnostics>
</configuration>

Paire avec une bonne regex analyse de script pour extraire les informations pertinentes, que vous pouvez exécuter à l'occasion sur la GraveOfBindErrors.txt dans votre dossier de sortie

System.Windows.Data Error: 35 : BindingExpression path error: 'MyProperty' property not found on 'object' ''MyWindow' (Name='')'. BindingExpression:Path=MyProperty; DataItem='MyWindow' (Name=''); target element is 'TextBox' (Name='txtValue2'); target property is 'Text' (type 'String')

6voto

J'utilise la solution présentée ici pour la liaison des erreurs en natif Exceptions: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d

Cependant, un scénario normal dans WPF liaisons est de lever des exceptions dans le cas où la saisie de l'utilisateur ne peut pas être converti vers le type de cible (par exemple, une zone de texte lié à un champ de type entier; l'entrée d'un non-numérique de la chaîne de résultats dans un FormatException la saisie d'un nombre trop grand de résultats dans un OverflowException). Un cas similaire est quand le Setter de la propriété de la source de renvoie une exception.

WPF moyen de ce traitement est via ValidatesOnExceptions=true et ValidationExceptionRule pour signaler à l'utilisateur la fourniture d'entrée n'est pas correcte (en utilisant le message de l'exception).

Toutefois, ces exceptions sont également envoyer à la fenêtre de sortie et donc "pris" par le BindingListener, ce qui entraîne une erreur...clairement pas le comportement que vous voulez.

Donc, j'ai élargi l' BindingListener classe pour ne PAS jeter une Exception dans ces cas:

private static readonly IList<string> m_MessagesToIgnore =
        new List<String>()
        {
            //Windows.Data.Error 7
            //Binding transfer from target to source failed because of an exception
            //Normal WPF Scenario, requires ValidatesOnExceptions / ExceptionValidationRule
            //To cope with these kind of errors
            "ConvertBack cannot convert value",

            //Windows.Data.Error 8
            //Binding transfer from target to source failed because of an exception
            //Normal WPF Scenario, requires ValidatesOnExceptions / ExceptionValidationRule
            //To cope with these kind of errors
            "Cannot save value from target back to source"  
        };

Les lignes modifiées dans le public override void WriteLine(string message):

        ....
        if (this.InformationPropertyCount == 0)
        {
            //Only treat message as an exception if it is not to be ignored
            if (!m_MessagesToIgnore.Any(
                x => this.Message.StartsWith(x, StringComparison.InvariantCultureIgnoreCase)))
            {
                PresentationTraceSources.DataBindingSource.Listeners.Remove(this);

                throw new BindingException(this.Message,
                    new BindingExceptionInformation(this.Callstack,
                        System.DateTime.Parse(this.DateTime),
                        this.LogicalOperationStack, int.Parse(this.ProcessId),
                        int.Parse(this.ThreadId), long.Parse(this.Timestamp)));
            }
            else
            {
                //Ignore message, reset values
                this.IsFirstWrite = true;
                this.DetermineInformationPropertyCount();
            }
        }
    }

5voto

Christian Moser Points 204

Vous pouvez utiliser la fonctionnalité de débogage de trigger de WPF Inspector . Il suffit de télécharger l'outil à partir de codeplex et de le joindre à votre application en cours d'exécution. Il affiche également des erreurs de liaison au bas de la fenêtre. Outil très utile!

entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X