2011-07-29 9 views
10

En una aplicación de la mina (esto tiene que ver con la navegación muy dinámico y la presentación de contenidos) Tengo que usar esta construcción en XAML:Fenómeno de enlazado de datos en WPF (vinculante para un FrameworkElement): ¿alguna idea de por qué?

<ContentControl Content={Binding ContentElement} /> 

Hasta ahora, todo bien. Esto es genial, absolutamente genial. Puedo alojar cosas arbitrarias por todo el lugar.

Pero no parece ser un extraño, así, vamos a llamarlo "fenómeno" en WPF (creo que es en el BindingMarkupExtension, pero no está seguro todavía):

Cuando mi propiedad ContentElement se ve así:

public FrameworkElement ContentElement 
{ 
    get 
    { 
     return this.m_ContentElement; 
    } 
} 

luego el getter se llama DOS VECES (!!!) para cada operación de enlace de datos (esto incluye cuando el usuario cambia el idioma sobre la marcha o recarga el control de alojamiento).

Sin embargo (y esto es lo que realmente está alucinante para mí):

Cuando cambio mi propiedad ContentElement a:

public object ContentElement 
{ 
    get 
    { 
     return this.m_ContentElement; 
    } 
} 

entonces el captador se llama a la vez. En serio, no estoy mintiendo aquí. Es absolutamente reproducible en las aplicaciones más simples, puede intentar, por ejemplo, devolviendo un nuevo "Bloque de texto" (eso es lo que suelo hacer para probar o aprender sobre conceptos más avanzados de WPF).

¿Alguna idea de por qué?

La razón por la que pido es que odio las siguientes consecuencias de la solución:

  • yo no pierda la seguridad de tipos en este punto
  • Esto puede ser un poco difícil de explicar a los nuevos desarrolladores o excesivamente escéptica chistosos
+0

No puedo reproducir esto aquí. El getter se llama una vez en cualquier caso. –

+1

Puede tener algo que ver con la versión de marco a la que se dirige. ¿Es 3.0, 3.5 o 4? – Will

+0

Sí, olvidé probar eso. No está ahí en 3.5, pero está en 4.0. – StormianRootSolver

Respuesta

4

Pude reproducirlo para .NET 4.0 pero no es reproducible para la misma aplicación cuando configura el framework .NET 3.5 en las preferencias del proyecto. En el caso de .NET 4.0, hay 2 llamadas para el getter si su tipo es FrameworkElement. Pero las pilas internas son diferentes. Así que definitivamente se debe a algunos aspectos internos de WPF 4.0. Y bueno ... es bastante difícil entender por qué y cómo funciona de esta manera. Si el tiempo lo permite alguien podría investigar internos WPF con reflector, pero yo creo que es la oportunidad de bola de nieve en el infierno :)

0

que tenía el mismo problema y encontré una respuesta de Microsoft en otro foro: http://connect.microsoft.com/VisualStudio/feedback/details/554237/problem-binding-image-property-called-twice-for-each-item

Como dijo Kreol, se Es interesante ver que esto se hizo en .NET 4.0.

No sé qué pensar al respecto. Ciertamente se hace a propósito, para mejorar las actuaciones o algo así.

En nuestro caso, tenemos una propiedad que devuelve una vista de nuestro modelo, y este punto de vista se mostrarán en pantallas diferentes, así que no podemos aplicar un único campo con un

si (_localValue != nulo)

instrucción, y debe crear un nuevo Control cada vez que se obtenga la propiedad. Por lo que puede que ya no sea tan funcional.

¿Alguna otra idea?

Cuestiones relacionadas