Cómo cambiar dinámicamente ConverterParameter (o cualquier) propiedad de un MultiBinding (o cualquier otro) de recursos en tiempo de ejecución?

StackOverflow https://stackoverflow.com/questions/1272049

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

¿Fue útil?

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 3 TextBlocks 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.

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