Cómo cambiar dinámicamente ConverterParameter (o cualquier) propiedad de un MultiBinding (o cualquier otro) de recursos en tiempo de ejecución?
Pregunta
soy nuevo en WPF y XAML. i encontrar soluciones de la mayoría de los problemas (en otros idiomas) mediante la búsqueda aquí n allí o alrededor de google pero éste me hizo loco. i buscado mucho en google y navegado muchos foros, pero parece que esta vez me encontré con un verdadero reto!
He siguiente código en Window.Resources:
<my:NameConverter x:Key="NameConverter"/>
<MultiBinding x:Key="CustomerFullNameBinding"
Converter="{StaticResource NameConverter}"
ConverterParameter="LastNameFirst">
<Binding Path="FirstName" />
<Binding Path="MiddleName" />
<Binding Path="LastName" />
</MultiBinding>
La NameConverter clase devuelve nombre completo mediante la combinación de partes individuales del nombre. El valor de retorno se basa en el valor de ConverterParameter que puede ser uno de los siguientes: FirstNameFirst, LastNameFirst, OnlyFirstName, OnlyLastName, Iniciales (hay unos cuantos más, pero por simplicidad , no vamos a considerar ellos)
Este código funciona bien. Yo uso siguiente para obtener el resultado:
<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>
Sin embargo, el problema es que si yo uso el recurso CustomerFullNameBinding 20 veces en mi código (como se muestra) abovw todos ellos mostraría el nombre en un formato particular. (Es decir, aquí en la declaración de CustomerFullNameBinding he puesto ConverterParameter = "LastNameFirst" por lo que los 20 referencias mostrarán en nombre solamente de esa manera.)
Ahora mi pregunta es ¿Puedo hacerlo más "generalizado" para que el yo pueda establecer el valor de ConverterParameter de forma dinámica? es decir que puedo tener varios bloques de texto que pueden mostrar nombre completo en diferentes formatos. Yo sé que es posible si creamos múltiples recursos como sigue:
<MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst"
Converter="..." ConverterParameter="FirstNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst"
Converter="..." ConverterParameter="LastNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName"
Converter="..." ConverterParameter="OnlyFirstName">
......
</MultiBinding>
... and so on ...
Pero no quiero que, 'coz que va a realmente hacer mi código demasiado voluminosos, y lo más importante es que voy de anular concepto de reutilización de los recursos!
Por favor, me sugieren cualquier solución posible.
Gracias de antemano.
Nota: me ocurrió la idea original de la aquí . El ejemplo de trabajo similar se puede encontrar msdn.microsoft.com/en-us/library/ms771336.aspx.
Etiquetas: WPF vinculante DynamicResource xaml StaticResource
Solución
Para poder cambiar el modo de visualización utilizado en cada caso, creo que lo hubiera hecho algo como esto:
- Crea un
UserControl
con 3TextBlock
s para la visualización de las 3 partes del nombre. - añadir propiedades a la anteriormente para las partes del nombre a ser blanco de unión.
- Añadir una propiedad por el modo en el que aparecerán ( FirstNameFirst , LastNameFirst , etc.)
Lo anterior requiere un enlace para cada una de las piezas del nombre, por lo que una manera de simplificar eso sería hacer una sola propiedad en la UserControl
de un NameData
tipo declarado como una estructura con propiedades First
, Middle
y Last
. Entonces todavía se podía utilizar un solo MultiBinding
a esa propiedad. La diferencia sería que su NameConverter
tomaría las 3 piezas y devolver una nueva estructura NameData
en lugar de una cadena con formato.
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />
<!-- and so on... -->
La idea es disociar el formato de los datos.
La parte que tropezó cosas estaba declarando una MultiBinding
como un recurso. Por lo general, habría un MultiBinding
en cada TextBlock
va a enlazar a fin de que se puede cambiar el ConverterParameter
para cada caso.
Editar Yo sé que quería ser capaz de cambiar ConverterParameter
, pero eso no es realmente posible debido a la 1 instancia de MultiBinding
y ConverterParameter
ser una planicie propiedad en lugar de un DependencyProperty
, que sería necesaria a ser el blanco de una DynamicResource
o Binding
.