none
ConvertParameter o alguna otra manera. RRS feed

  • Pregunta

  • Hola a todos, verán tengo el siguiente problema. Tengo dos propiedades en un modelo pero en la vista quiero que un textblock muestre una información u otra dependiendo de los valores de estas dos columnas. No puedo hacerlo en el viewmodel porque si no cada vez que lo use me va a venir esta información y no la quiero.

    He intentado usar convert en xaml pero no puedo pasarle como parámetro un binding, algo así como una columna como valor del textblock y la otra como convertparameter. Así que la pregunta es ¿como rellenar un textblock  dependiendo de dos propiedades de un modelo?

    Gracias de antemano


    fsantanac

    martes, 25 de junio de 2013 16:18

Todas las respuestas

  • Hola Felipe,

    A ver si te he entendido bien. Tienes lo siguiente en el modelo:

    Modelo

    • Propiedad 1
    • Propiedad 2

    En la vista tienes un TextBlock y dependiendo de los valores de las 2 propiedades, quieres mostrar una información u otra en el TextBlock.

    Lo que no me queda claro:

    • ¿Qué información quieres mostrar en el TextBlock y de donde viene?
    • ¿Me podrías dar más detalles sobre las condiciones? ¿Cuando se debería mostrar un valor, y cuando el otro?
    • ¿Por qué es un problema poner esa información / la lógica en el ViewModel? (¿Estas usando el mismo ViewModel para varias vistas?)

    Un saludo


    Helge Mahrt - Microsoft Developer Support Escalation Engineer - If my reply answers your question, please mark this post as answered.

    miércoles, 26 de junio de 2013 10:44
  • Gracias de antemano. Te respondo a tus cuestiones:

    En la vista tienes un TextBlock y dependiendo de los valores de las 2 propiedades, quieres mostrar una información u otra en el TextBlock. --> Correcto

    ¿Qué información quieres mostrar en el TextBlock y de donde viene? --> Depende de los valores de las 2 propiedades, fundamentalmente si la 2 tiene valor poner esta y si no poner la 1

    ¿Por qué es un problema poner esa información / la lógica en el ViewModel? (¿Estas usando el mismo ViewModel para varias vistas?) --> Efectivamente.

    Ayer lo que hice fue crearme en el view model un método nuevo concatenando los dos valores para así poder pasarlos al converter. Me funciona pero, estoy convencido aunque no lo encuentro en la documentación, que hay otra forma de hacerlo.

    Gracias de nuevo



    fsantanac

    miércoles, 26 de junio de 2013 13:55
  • Hola Felipe,

    Gracias por la confirmación.

    En WPF o Silverlight se podría haber implementado usando los MultiBindings (http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx). Desafortunadamente, no están disponibles para apps de Windows Store y tenemos que encontrar otra forma de conseguirlo.

    Ya que el ViewModel es la capa entre el modelo y la vista, y se encarga de preparar los datos de tal forma que la vista los pueda entender/leer, lo lógico sería usar el ViewModel para hacer la selección entre los dos valores. Como tienes que exponer los 2 valores en el ViewModel de todas maneras, ¿por qué no puedes exponer una propiedad que internamente hace la selección?

    Como alternativa se me ocurre lo siguiente:

    <StackPanel>
        <TextBlock Text="{Binding Propiedad1}" Visibility="{Binding Propiedad2, Converter={StaticResource NullToVisConverter}, ConverterParameter=invert}"/>
        <TextBlock Text="{Binding Propiedad2}" Visibility="{Binding Propiedad2, Converter={StaticResource NullToVisConverter}}"/>
    </StackPanel>

    Creamos un TextBlock para cada propiedad y un IValueConverter que traduce el valor de Propiedad2 en Visibility. (Si es null, retorna Visibility.Collapsed, si no, retorna Visibility.Visible) Si le pasamos al converter el parámetro "invert" (o lo que sea), el resultado va a ser lo contrario - para que siempre solo haya un TextBlock visible.

    No queda tan elegante como poner la lógica en el ViewModel, pero así no tienes que añadir otra propiedad. 

    Espero que te sea útil.


    Helge Mahrt - Microsoft Developer Support Escalation Engineer - If my reply answers your question, please mark this post as answered.

    miércoles, 26 de junio de 2013 14:19
  • Hola!

    La solución de Helge es bastante correcta, muestras uno u otro textblock dependiendo del valor de la propiedad2.

    Otra solución es que hagas un converter que reciba la ViewModel como Value, y dentro del converter accedas a las dos propiedades y decidas que texto devolver. Como el ViewModel se pasa por referencia, realmente no es más costoso ni consumirá más memoria.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    miércoles, 3 de julio de 2013 6:42
    Moderador