none
Modificar controles de un ListboxItem dinamicamente desde codigo RRS feed

  • Pregunta

  • Buenas,

    queria saber si se puede modificar controles que tenga un Listboxitem dinamicamente sin tener que hacer diferentes datetemplates con un datetemplateselector desde xaml.

    Un ejemplo, el listboxItem es un objeto de tipo cliente que tiene 4 campos (nombre, domicilio, puesto, sueldo). He creado un DataTemplate con cuatro controles de tipo textbox para alojar los campos pertinentes. Mi idea es dependiendo del valor campo "puesto" se aparezca en un color el textbox o en otro.

    saludos y gracias

    miércoles, 26 de octubre de 2011 7:52

Respuestas

  • O sea que quieres que si tienes dos campos:

    Campo1 con valor "A"

    Campo2 con Valor "B"

    ¿Tengas 2 TextBox que dependen del nombre y del valor no?

    Para eso debes usar Converters, mira este ejemplo:

    http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

    Un saludo,

    Eugenio 


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Marcado como respuesta Pedro Net miércoles, 26 de octubre de 2011 14:05
    miércoles, 26 de octubre de 2011 13:32
  • WPF/Silverlight está pensado para usar el patrón de diseño MVVM, este patrón se basa del aislamiento de la lógica de negocio y el modelo de datos de la propia interfaz mantiendo un alto grado de acoplamiento.

    La decisión de si un TextBox es de un color u otro en función del valor de un dato de tu modelo es una decisión de negocio y no de interfaz.

    No sé cual es el momento exacto "nada más actualizar el control al que se ha llamado" por lo que no puedo saber si el árbol visual de ese control está creado o no, necesito algo más de información.


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Marcado como respuesta Pedro Net miércoles, 26 de octubre de 2011 14:05
    miércoles, 26 de octubre de 2011 14:04

Todas las respuestas

  • ¿Dependiendo del nombre del campo o del contenido del campo?

    Un saludo,

    Eugenio 


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    miércoles, 26 de octubre de 2011 11:26
  • Hola Eugenio,

    de ambas cosas jeje. Tanto del nombre del campo como el contenido.

    saludos

    miércoles, 26 de octubre de 2011 13:29
  • O sea que quieres que si tienes dos campos:

    Campo1 con valor "A"

    Campo2 con Valor "B"

    ¿Tengas 2 TextBox que dependen del nombre y del valor no?

    Para eso debes usar Converters, mira este ejemplo:

    http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

    Un saludo,

    Eugenio 


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Marcado como respuesta Pedro Net miércoles, 26 de octubre de 2011 14:05
    miércoles, 26 de octubre de 2011 13:32
  • Gracias por la respuesta, es una idea interesante aunque he encontrado algo que funciona más directo para modificar valores de controles de un ListboxItem de un listbox.

        private void ModificarListBoxItemTemplate(DependencyObject targetElement)
        {
          var count = VisualTreeHelper.GetChildrenCount(targetElement);
          if (count == 0)
            return;
    
          for (int i = 0; i < count; i++)
          {
            var child = VisualTreeHelper.GetChild(targetElement, i);
            if (child is TextBlock)
            {
              TextBlock control = (TextBlock)child;
              if (control.Name == "tbEmpleado")
              {
                switch (control.Text)
                {
                  case "Usuario":
                    control.Foreground = new SolidColorBrush(Colors.Green);
                    break;
                  case "Responsable":
                    control.Foreground = new SolidColorBrush(Colors.Red);
                    break;
                  case "Gerente":
                    control.Foreground = new SolidColorBrush(Colors.Black);
                    break;
    
                }
              }
            }
            else
            {
              ModificarListBoxItemTemplate(child);
            }
          }
        }
    

    El problema es que la función VisualHelperChild.GetChildrenCount() solo me funciona cuando salgo del foco del control que trato. Es decir, que tengo que llamar a esta funcion desde otro control para que actualize el contenido del listbox. Nada más rellenar el ItemSource del listbox si llamo a esta función me dá 0 como número de Childrens. He intentado pasarla al ItemSource un tipo ObservableCollection, en vez de, un list por si era por la actuación pero tampoco me ha funcionado.

     

     

     

     

     

    miércoles, 26 de octubre de 2011 13:51
  • Para este caso no deberías acceder al árbol visual, es algo depende de "negocio" no de UI y los converters son los que se dedican a esas cosas.

    Un saludo,


    Eugenio


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    miércoles, 26 de octubre de 2011 13:53
  • Para este caso no deberías acceder al árbol visual, es algo depende de "negocio" no de UI y los converters son los que se dedican a esas cosas.

    Un saludo,


    Eugenio


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es


    Podria explicarme porque no deberia acceder al árbol visual? . Y sabes el por qué no realiza el VisualHelperChild.GetChildrenCount() nada más actualizar el control al que se ha llamado?

    saludos y gracias por tu tiempo.

    miércoles, 26 de octubre de 2011 13:58
  • WPF/Silverlight está pensado para usar el patrón de diseño MVVM, este patrón se basa del aislamiento de la lógica de negocio y el modelo de datos de la propia interfaz mantiendo un alto grado de acoplamiento.

    La decisión de si un TextBox es de un color u otro en función del valor de un dato de tu modelo es una decisión de negocio y no de interfaz.

    No sé cual es el momento exacto "nada más actualizar el control al que se ha llamado" por lo que no puedo saber si el árbol visual de ese control está creado o no, necesito algo más de información.


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Marcado como respuesta Pedro Net miércoles, 26 de octubre de 2011 14:05
    miércoles, 26 de octubre de 2011 14:04
  • Gracias por la explicación. Viendo el hilo que has puesto me pregunto, ¿Esto significa que si tienes 18 estados diferentes deberias declararos como recursos para poder usarlos?. No hay ninguna forma que llegues a la propiedad de un control dentro de un contenedor de una manera más directa?

     

    saludos

    miércoles, 26 de octubre de 2011 14:15
  • O como recursos o como parte de la lógica del Converter :)
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    miércoles, 26 de octubre de 2011 14:29
  • Eso de parte lógica no lo he entendido. Voy a mirarme mejor los binding converters.

    saludos

    miércoles, 26 de octubre de 2011 14:53