Principales respuestas
Modificar controles de un ListboxItem dinamicamente desde codigo

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
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
-
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
Todas las 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
-
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. -
-
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.
-
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
-
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
-
-