visual tutorial studio que español ejemplos desde cero aprender wpf data-binding

tutorial - ¿Cómo detectar el enlace de datos WPF roto?



wpf vs windows forms (7)

Aquí hay una técnica útil para eliminar errores de desencadenamiento / rastreo de manera efectiva. Le permite registrar todas las acciones de activación junto con el elemento sobre el que se actúa:

Mientras trataba de responder a una pregunta en las proximidades " Unit Testing WPF Bindings ", tuve la siguiente pregunta incómoda:
¿Cuál es la mejor manera de encontrar si tiene una configuración de cableado de enlace de datos WPF incorrecta (o simplemente rompió algo que estaba cableado correctamente)?

Aunque el enfoque de pruebas unitarias parece ser como el de Joel "arrancándote el brazo para quitar una astilla" ... Estoy buscando maneras menos generales de detectar esto.

Todos parecen haberse comprometido con el enlace de datos de forma importante con WPF ... y tiene sus méritos.


En .NET 3.5 se introdujo una nueva forma de generar específicamente información de seguimiento sobre enlaces de datos específicos.

Esto se realiza a través de la nueva propiedad adjunta System.Diagnostics.PresentationTraceSources.TraceLevel que puede aplicar a cualquier vinculante o proveedor de datos. Aquí hay un ejemplo:

<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>

Esto colocará información de seguimiento para ese enlace en particular en la ventana de resultados de Visual Studio, sin necesidad de configuración de seguimiento.


Esto fue muy útil para nosotros, pero quería agregar a aquellos que lo encuentran útil que hay una utilidad que Microsoft proporciona con el SDK para leer este archivo.

Se encuentra aquí: http://msdn.microsoft.com/en-us/library/ms732023.aspx

Para abrir un archivo de rastreo

1. Inicie Service Trace Viewer utilizando una ventana de comandos para navegar a la ubicación de instalación de WCF (C: / Archivos de programa / Microsoft SDKs / Windows / v6.0 / Bin) y luego escriba SvcTraceViewer.exe. (Aunque encontramos el nuestro en / v7.0 / Bin)

Nota: La herramienta Visor de seguimiento de servicio puede asociarse con dos tipos de archivos: .svclog y .stvproj. Puede usar dos parámetros en la línea de comando para registrar y anular el registro de las extensiones de archivo.

/ register: registrar la asociación de extensiones de archivo ".svclog" y ".stvproj" con SvcTraceViewer.exe

/ unregister: anule el registro de la asociación de extensiones de archivo ".svclog" y ".stvproj" con SvcTraceViewer.exe

1. Cuando se inicia Service Trace Viewer, haga clic en Archivo y luego apunte a Abrir. Navegue a la ubicación donde se almacenan sus archivos de rastreo.

2. Haga doble clic en el archivo de rastreo que desea abrir.

Nota: Presione MAYÚSCULAS mientras hace clic en múltiples archivos de rastreo para seleccionarlos y abrirlos simultáneamente. Service Trace Viewer fusiona el contenido de todos los archivos y presenta una vista. Por ejemplo, puede abrir archivos de rastreo de cliente y servicio. Esto es útil cuando habilita el registro de mensajes y la propagación de actividad en la configuración. De esta manera, puede examinar el intercambio de mensajes entre el cliente y el servicio. También puede arrastrar varios archivos al visor o usar la pestaña Proyecto. Consulte la sección Gestión de proyectos para obtener más detalles.

3.Para agregar archivos de rastreo adicionales a la colección que está abierta, haga clic en Archivo y luego seleccione Agregar. En la ventana que se abre, navegue a la ubicación de los archivos de rastreo y haga doble clic en el archivo que desea agregar.

Además, en cuanto al filtrado del archivo de registro, encontramos que este enlace es extremadamente útil:

http://msdn.microsoft.com/en-us/library/ms751526.aspx


Lo mejor que pude encontrar ...

¿Cómo puedo depurar enlaces WPF? por Beatriz Stollnitz

Como todos no siempre pueden estar atentos a la Ventana de Salida buscando errores de Encuadernación, me encantó la Opción # 2. Que es agregar esto a su App.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>

Combine eso con una buena secuencia de comandos de exploración de expresiones regulares para extraer información relevante, que puede ejecutar ocasionalmente en GraveOfBindErrors.txt en su carpeta de salida

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'')


Para cualquier persona como yo que busque una forma programática pura de habilitar todo el seguimiento de WPF en un nivel de seguimiento determinado, aquí hay un fragmento de código que lo hace. Como referencia, se basa en este artículo: fuentes de rastreo en WPF .

No requiere un cambio en el archivo app.config, y tampoco requiere cambiar el registro.

Así es como lo uso, en algún lugar de inicio (aplicación, etc.):

.... #if DEBUG WpfUtilities.SetTracing(); #endif ....

Y aquí está el código de utilidad (por defecto, envía todas las advertencias al escucha de seguimiento predeterminado):

public static void SetTracing() { SetTracing(SourceLevels.Warning, null); } public static void SetTracing(SourceLevels levels, TraceListener listener) { if (listener == null) { listener = new DefaultTraceListener(); } // enable WPF tracing PresentationTraceSources.Refresh(); // enable all WPF Trace sources (change this if you only want DataBindingSource) foreach (PropertyInfo pi in typeof(PresentationTraceSources).GetProperties(BindingFlags.Static | BindingFlags.Public)) { if (typeof(TraceSource).IsAssignableFrom(pi.PropertyType)) { TraceSource ts = (TraceSource)pi.GetValue(null, null); ts.Listeners.Add(listener); ts.Switch.Level = levels; } } }


Puede usar la función de eliminación de errores de WPF Inspector. Simplemente descargue la herramienta de codeplex y conéctela a su aplicación en ejecución. También muestra errores de enlace en la parte inferior de la ventana. Herramienta muy útil!


Utilizo la solución presentada aquí para convertir los errores de enlace en excepciones nativas: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d

Sin embargo, un escenario normal en los enlaces WPF es lanzar excepciones en caso de que la entrada del usuario no se pueda convertir al tipo de destino (por ejemplo, un TextBox vinculado a un campo entero; la entrada de una cadena no numérica da como resultado FormatException, el la entrada del número que es demasiado grande da como resultado una OverflowException). Un caso similar ocurre cuando el Organizador de la propiedad de origen arroja una excepción.

La forma de manejarlo de WPF es a través de ValidatesOnExceptions = true y ValidationExceptionRule para indicar al usuario que la entrada suministrada no es correcta (utilizando el mensaje de excepción).

Sin embargo, estas excepciones también se envían a la ventana de salida y, por lo tanto, ''atrapadas'' por BindingListener, lo que da como resultado un error ... claramente no es el comportamiento que usted desearía.

Por lo tanto, BindingListener clase BindingListener para NO arrojar una excepción en estos casos:

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" };

Las líneas modificadas en público invalidan WriteLine vacío (mensaje de cadena) :

.... 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(); } } }