En una aplicación WPF, en la aplicación MVP, tengo un cuadro combinado, para el cual muestro los datos obtenidos de la base de datos. Antes de los elementos agregados al cuadro combinado, quiero mostrar el texto predeterminado, como
" -- Selecciona un equipo --"
para que al cargar la página se muestre y al seleccionarlo se borre el texto y se muestren los elementos.
Está sucediendo la selección de datos de la base de datos. Necesito mostrar el texto predeterminado hasta que el usuario seleccione un elemento del cuadro combinado.
Por favor guíame
Focusable="False" IsEditable="True" IsReadOnly="True"
Puede hacer esto sin ningún código detrás usando un
IValueConverter
.Aquí tienes la clase de convertidor que puedes reutilizar.
Y finalmente, debe declarar su convertidor en una sección de recursos.
Donde Convertidores es el lugar donde ha colocado la clase de convertidor. Un ejemplo es:
Lo bueno de este enfoque es que no hay repetición de código en su código subyacente.
fuente
DataTrigger
para evitar incluso el código del convertidor aquí :)Me gusta la respuesta de Tri Q, pero esos convertidores de valor son difíciles de usar. PaulB lo hizo con un controlador de eventos, pero eso también es innecesario. Aquí hay una solución XAML pura:
fuente
Nadie dijo que una solución xaml pura tiene que ser complicada. Aquí hay uno simple, con 1 disparador de datos en el cuadro de texto. Margen y posición como se desee
fuente
<Setter Property="Visibility" Value="Hidden"/>
fuera del activador (dentro del estilo) y eliminarVisibility="Hidden"
del elemento de bloque de texto realEstablecer
IsEditable="True"
en elComboBox
elemento. Esto mostrará laText
propiedad deComboBox
.fuente
No sé si es compatible directamente, pero puede superponer el combo con una etiqueta y configurarlo como oculto si la selección no es nula.
p.ej.
Luego, en la selección cambió el controlador ...
fuente
Basado en la respuesta de IceForge, preparé una solución reutilizable:
estilo xaml:
ejemplo de uso:
fuente
No lo probé con cuadros combinados, pero esto me ha funcionado con otros controles ...
publicación de blog ageektrapped
Utiliza la capa de adorno aquí para mostrar una marca de agua.
fuente
La solución de HappyNomad fue muy buena y finalmente me ayudó a llegar a esta solución ligeramente diferente.
fuente
La forma más sencilla es utilizar CompositeCollection para fusionar el texto y los datos predeterminados de la base de datos directamente en ComboBox, por ejemplo
Y en Recursos, defina StaticResource para vincular las opciones de ComboBox a su DataContext, porque el enlace directo en CollectionContainer no funciona correctamente.
De esta manera, puede definir sus opciones de ComboBox solo en xaml, por ejemplo
fuente
Recomendaría lo siguiente:
Definir un comportamiento
Usuario el comportamiento
fuente
La respuesta de IceForge fue bastante cercana, y es AFAIK la solución más fácil a este problema. Pero se perdió algo, ya que no estaba funcionando (al menos para mí, nunca muestra el texto).
Al final, no puede simplemente establecer la propiedad "Visibilidad" del TextBlock en "Oculto" para que se oculte cuando el elemento seleccionado del cuadro combinado no sea nulo; tienes que CONFIGURARlo de esa manera por defecto (ya que no puedes marcar no nulo en los disparadores , usando un Setter en XAML en el mismo lugar que los desencadenadores.
Aquí está la solución real basada en la suya, el Setter faltante se coloca justo antes de los Triggers:
fuente
EDITAR: Según los comentarios a continuación, esta no es una solución. No estoy seguro de cómo lo hice funcionar y no puedo verificar ese proyecto.
Es hora de actualizar esta respuesta para la última versión de XAML.
Al encontrar esta pregunta SO buscando una solución a esta pregunta, descubrí que la especificación XAML actualizada tiene una solución simple.
Un atributo llamado "Marcador de posición" ahora está disponible para realizar esta tarea. Es tan simple como esto (en Visual Studio 2015):
fuente
PlaceholderText
propiedad en laSystem.Windows.ComboBox
clase . Esta es una pregunta sobre WPF, no sobre WinForms.No es la mejor práctica ... pero funciona bien ...
Código detrás
fuente
Creo una marca de agua como se menciona en esta publicación. funcionaría bien en este caso
Se necesita un poco de código, pero puede reutilizarlo para cualquier cuadro combinado o cuadro de texto (e incluso cuadros de contraseña), así que prefiero esta forma
fuente
Estoy usando una clase IsNullConverter en mi proyecto y funcionó para mí. aquí está el código en c #, cree una carpeta llamada Convertidor y agregue esta clase en esa carpeta, ya que el disparador utilizado no admite valor en lugar de nulo, y IsNullConverter simplemente haga eso
agregue el espacio de nombres en el archivo xaml como este.
medio
use esta línea debajo de los recursos para que esté disponible a través del código xaml
aquí está el código xaml, utilicé aquí el disparador, por lo que cada vez que se selecciona un elemento en el cuadro combinado, la visibilidad de su texto se vuelve falsa.
fuente
// Código XAML
// Código de ViewModel
fuente
Un poco tarde pero ...
Una forma más sencilla sería agregar un elemento de datos ficticios a la lista con el parámetro IsDummy = true y asegurarse de que no sea HitTestVisable y que su altura sea de 1 píxel (usando un convertidor) para que no se vea.
Que simplemente registrarse en SelectionChanged y en él, establezca el índice en el índice del elemento ficticio.
Funciona a las mil maravillas y de esta manera no se mete con el estilo y los colores del ComboBox o el tema de su aplicación.
fuente
El código anterior demuestra la forma más sencilla de lograrlo. Después de cargar la ventana, declare el texto del cuadro combinado, usando la propiedad .Text del cuadro combinado. Esto se puede extender a DatePicker, Textbox y otros controles también.
fuente
Lo hice antes de vincular el cuadro combinado con datos de la base de datos en código subyacente como este:
fuente
Coloque una etiqueta en la parte superior del cuadro combinado.
Vincular el contenido de la etiqueta a la propiedad Text del cuadro combinado.
Establezca la opacidad del cuadro combinado en cero, Opacidad = 0.
Escribir texto predeterminado en la propiedad Text del cuadro combinado
fuente
Solo establezca el atributo IsEditable en verdadero
fuente
Sé que esto es semi viejo, pero ¿qué pasa de esta manera?
fuente
ComboBox
no tieneEmptySelectionBoxTemplate
propiedad.