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é
Puede usar ConstructorArgumentAttribute para no tener que indicar explícitamente 'Path = ...'. –