2009-06-19 8 views
7

Actualmente estoy jugando con el enlace de datos WPF y llegué a un problema que no entiendo. Así que publico el problema aquí, tal vez tienes una idea de lo que está mal geoing.La clase de enlace personalizada no funciona correctamente

Al principio: estoy trabajando con Visual Studio 2008 en Windows Vista 32 bits, el problema también está presente en Windows 7 RC1 64 bits, las últimas actualizaciones/service packs están instaladas excepto Vista, todavía funciona con SP1.

Aquí está el problema: No puedo establecer un ValueConverter en una clase Binding heredada.

Aquí es mi costumbre clase de unión:

public class MyBinding : Binding 
{ 
    public MyBinding() : base() { } 
    public MyBinding(string path) : base(path) { } 
} 

Esta clase debe hacer exactamente la misma que la clase Binding original porque actualmente no implementa ninguna lógica propia. Puedo utilizar esta clase en XAML como sigue:

<TextBlock Text="{local:MyBinding SomeProperty}" /> 

local es el espacio de nombres en el que se implementa la clase Mybinding.

Ahora aquí viene lo primero que no entiendo. VS2008 muestra el siguiente mensaje de error en su ventana de error (el mensaje original está en alemán, porque estoy corriendo un sistema alemán - no tengo el mensaje de error Inglés, así que voy a tratar de traducir)

Kein Konstruktor des MyBinding-Typs weist 1-Parameter auf.

(n constructor del tipo Mybinding toma 1 argumento)

Althoug este error es visualizar el proyecto compila bien y la clase Mybinding está funcionando como se esperaba. ¿Por qué Visual Studio no encuentra el constructor correspondiente (que, diría yo, está implementado correctamente)?

puedo evitar que estos mensajes si cambio el código XAML a esto:

<TextBlock Text="{local:MyBinding Path=SomeProperty}" /> 

El mensaje de error se ha ido porque constructor por defecto del Mybinding se llama, todo funciona bien, bien ...

ahora me gustaría establecer una ValueConverter a la unión de mi propiedad, XAML se ve así:

<Window.Resources> 
    <local:MyValueConverter x:Key="converter" /> 
</Window.Resources> 
[...] 
<TextBlock Text="{local:MyBinding Path=SomeProperty, Converter={StaticResource converter}}" /> 
[...] 

..., y aquí me sale el siguiente error al compilar (fre nal en alemán y creo, también he encontrado el mensaje original en Inglés):

Beim analysieren einer marcado de Extensión wurde für den Typ "MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension" morir unbekannte Eigenschaft "Convertidor "gefunden. Zeile X Posición Y.

(Propiedad desconocida 'convertidor' para el tipo 'MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension' encontrado al analizar una extensión de marcado. Línea posición x Y)

Ahora no puedo compilar ya que VS no encuentra la propiedad del convertidor (que es una propiedad pública de la clase Binding original).

he logrado obtener la clase Mybinding para funcionar con un convertidor especifico, pero sólo con un pequeño truco: He añadido la siguiente propiedad a la clase Mybinding:

public Type ConverterType 
    { 
     get { return Converter == null ? null : Converter.GetType(); } 
     set { Converter = value == null ? null : (IValueConverter)Activator.CreateInstance(value); } 
    } 

.. . y XAML cambia a esto:

<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" /> 

Ahora mi proyecto compila y funciona bien. En realidad, creo que es una buena solución, porque no tienes que especificar el convertidor como un recurso estático y la expresión vinculante me parece un poco más clara. Pero al final, esta no puede ser la solución.

Entonces, ¿alguien puede decirme qué he hecho mal? ¿Por qué no puedo configurar la propiedad Convertidor en mi clase de enlace personalizado?

¡Gracias! Saludos cordiales, René

+0

Puede usar ConstructorArgumentAttribute para no tener que indicar explícitamente 'Path = ...'. –

Respuesta

2

La herencia de Binding probablemente no sea la mejor solución. Si simplemente desea moverse por la que se declara un convertidor como un recurso estático, intente crear un Singleton de su convertidor, y usarlo de esta manera:

Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}" 

Alternativamente, usted podría tratar de una extensión de marcado como se muestra here.

0

¡Gracias por su respuesta!

En general, no tengo ningún problema con la sintaxis de expresión de enlace y declarar el convertidor antes de usarlo. Lo que escribí arriba es solo un buen resultado de la solución para mi problema principal. Quiero crear mi propia clase de encuadernación y pasarle mi propio convertidor de la misma manera que lo haría con la clase de encuadernación original.

Solo quiero entender el mensaje de error, que me fue presentado por VS. Creo que debe tener una razón, o estoy haciendo algo mal o hay un error en Visual Studio/WPF.

Hasta esta tarde estaba bastante seguro de que el problema está sentado frente a la computadora. Pero publiqué esta pregunta en otros dos grupos de usuarios (también en MSDN en el foro de WPF). Hasta ahora eres la única persona que responde. Y entonces llegué a la idea, que también podría ser un problema con Visual Studio ... No lo sé.

De nuevo, muchas gracias, voy a echar un vistazo más de cerca a la página que ha publicado (actualmente solo una breve).

Que tengas un buen fin de semana!

Saludos, René

6

después de algunas pruebas más con extensiones de marcado, este problema pasa mi camino una y otra vez y después de un poco más de google, creo que he encontrado una confirmación, que se trata de un error en el diseñador de Visual Studio. Todo el mundo, whos interesado en que debería echar un vistazo a

http://www.hardcodet.net/2008/04/nested-markup-extension-bug

Saludos, René

0

que tenía el mismo problema, no sé por qué, pero poner el enlace en otro archivo DLL personalizado y funcionó.

Cuestiones relacionadas