2009-08-13 12 views
5

soy nuevo en wpf y xaml. Encuentro soluciones para la mayoría de los problemas (en otros idiomas) buscando aquí n allí o buscando en Google, pero este me volvió loco. busqué mucho en google y hojeé muchos foros, ¡pero parece que esta vez me encontré con un verdadero desafío!¿Cómo cambiar dinámicamente ConverterParameter (o cualquier) propiedad de un MultiBinding (o cualquier otro recurso) en tiempo de ejecución?

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> 

El 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 se mostrará el nombre en un formato especial . (Es decir, aquí en la declaración de CustomerFullNameBinding he puesto ConverterParameter = "LastNameFirst" lo que todas las 20 referencias mostrará el nombre sólo de esa manera.)

Ahora mi pregunta es ¿Puedo hacer que sea más "generalizada" de modo que Puedo establecer el valor de ConverterParameter dinámicamente? es decir, puedo tener varios bloques de texto que pueden mostrar el 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, sugiero cualquier posible solución.
Gracias de antemano.

Nota: Obtuve la idea original desde here. El ejemplo de trabajo similar se puede encontrar msdn.microsoft.com/en-us/library/ms771336.aspx.

Etiquetas: WPF XAML StaticResource vinculantes

Respuesta

3

Para poder cambiar el modo de visualización utilizado en cada caso, creo que DynamicResource me lo habrían hecho algo como esto:

  • Crear una UserControl con 3 TextBlock s para mostrar las 3 partes del nombre.
  • Agregue propiedades a las anteriores para que las partes del nombre sean segmentados.
  • Agregue una propiedad para el modo en que se mostrará (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 tipo NameData declarada como una estructura con First, Middle, y Last propiedades. Entonces aún podría usar un solo MultiBinding a esa propiedad. La diferencia sería que su NameConverter tomaría las 3 piezas y devolvería una nueva estructura NameData en lugar de una cadena formateada.

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" /> 

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" /> 

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" /> 

<!-- and so on... --> 

La idea es desacoplar el formato de los datos.

La parte que tropezó las cosas fue declarar un MultiBinding como recurso. Por lo general, habría un MultiBinding en cada TextBlock al que se está vinculando para que pueda cambiar el ConverterParameter para cada caso.

Editar: 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, lo que sería necesario para ser el blanco de un DynamicResource o Binding.

+0

Muchas gracias por su rápida respuesta. Eres cierto. ConverterParameter es una propiedad simple, no una DependencyProperty. En realidad, soy nuevo en WPF y, a veces, ¡también me olvido de los conceptos básicos! Tener un control de usuario vinculado a un recurso dinámico que devuelve una estructura en lugar de una cadena es realmente una gran idea. ¡Realmente no lo he intentado, pero estoy seguro de que va a funcionar! ¡¡¡Gracias otra vez!!! – mg007

Cuestiones relacionadas