Pregunta

Tengo un problema con un enlace de datos en WPF.

Cuando intento utilizar un convertidor de valores y establecer el NotifyOnTargetUpdated = true en True, me sale un XamlParseException con el mensaje siguiente:

  

'System.Windows.Data.BindingExpression'   valor no se puede asignar a la propiedad   'Contenu' del objeto   'View.UserControls.ShadowedText'.   El valor no puede ser nulo. Nombre de parámetro:   Error textToFormat en objeto   'System.Windows.Data.Binding' en   archivo de anotación   'View.UserControls; componente / saletotal.xaml'   Línea 363 Posición 95.

La unión es bastante estándar:

<my:ShadowedText Contenu="{Binding Path=Total,
                                   Converter={StaticResource CurrencyToStringConverter},
                                   NotifyOnTargetUpdated=True}"
                 TargetUpdated="MontantTotal_TargetUpdated">
</my:ShadowedText>

(propiedades retiradas por concisión Styling)

El convertidor existe en los recursos y funciona correctamente cuando se quita NotifyOnTargetUpdated = True. Del mismo modo, el evento se llama TargetUpdated e implementado correctamente y funciona cuando se retira el convertidor.

Nota:. Esta unión se define en una ControlTemplate, aunque no creo que sea relevante para el problema

¿Alguien puede explicar lo que está sucediendo? Estoy definiendo el mal vinculante? Son aquellos rasgos excluyentes entre sí (y en este caso, ¿puede explicar por qué es tan)?

Gracias de antemano.

Más información: Aquí está el contenido del manejador TargetUpdated:

private void MontantTotal_TargetUpdated(object sender, DataTransferEventArgs e)
{
    ShadowedText textBlock = (ShadowedText)e.TargetObject;
    double textSize = textBlock.Taille;
    double delta = 5;
    double defaultTaille = 56;
    double maxWidth = textBlock.MaxWidth;
    while (true)
    {
        FormattedText newFormat = new FormattedText(textBlock.Contenu,
                                                    CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                                                    new Typeface("Calibri"), textSize,
                                                    (SolidColorBrush) Resources["RougeVif"]);
        if (newFormat.Width < textBlock.MaxWidth && textSize <= defaultTaille)
        {
            if ((Math.Round(newFormat.Width) + delta) >= maxWidth || textSize == defaultTaille)
            {
                break;
            }
            textSize++;
        }
        else
        {
            if ((Math.Round(newFormat.Width) - delta) <= maxWidth && textSize <= defaultTaille)
            {
                break;
            }
            textSize--;
        }
    }

    textBlock.Taille = textSize;
}

El papel del manipulador es cambiar el tamaño del control basado en la longitud del contenido. Es bastante feo, pero yo quiero tener la parte funcional de trabajo antes de refactorización.

¿Fue útil?

Solución

Si usted está recibiendo un XamlParseException que significa este error ocurre durante la inicialización de este control.

Con NotifyOnTargetUpdated=True especifica, el evento TargetUpdated está siendo elevado dentro de la llamada InitializeComponent. En este punto, es increíblemente DUDOSOS tiene un DataContext, por lo que la unión se evaluará como nulo. Normalmente, no hay problema, pero que está solicitando un evento se genera cuando la propiedad se actualiza.

Así que es golpear a su controlador de eventos con un valor nulo textBlock.Contenu, que está pasando en el primer parámetro de FormattedText (que lleva el nombre textToFormat) y se está lanzando una ArgumentNullException.

Practique una cierta programación defensiva y comprobar su valor para textBlock.Contenu nula antes de ejecutar su código.

Dos consejos para futuras referencias:

1) Cuando se recibe una excepción, pegue todo el seguimiento de la pila, incluyendo InnerException (así que llame Exception.ToString). Más a menudo que no, se verá en los que está sucediendo. Si no es así, alguien de aquí va a ver dónde está sucediendo mucho más rápido que tienes tu respuesta.

2) Cuando se recibe una excepción, y no saber dónde está siendo lanzada desde (y que claramente no lo hacen, o se habría visto que es en su código), forzar Visual Studio para romper en todas las excepciones. http://msdn.microsoft.com/en-us /library/d14azbfh(VS.80).aspx

(Tenga en cuenta que dependiendo de la configuración, el elemento de menú que hacen referencia puede o no estar allí. También se puede utilizar CTRL + ALT + E para abrir el cuadro de diálogo Excepciones.)

Con este conjunto, el depurador se detendrá en la línea exacta de código de lanzar la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top