¿Cómo se muestra un valor diferente para los valores de la lista desplegable / elemento seleccionado en un WPF ComboBox?

Tengo un combobox de WPF vinculado a una lista de elementos con descripciones largas.

El tipo vinculado al ComboBox tiene propiedades de descripción corta y larga. Actualmente, soy vinculante para la descripción completa.

comboBox.DisplayMemberPath = "FullDescription"; 

¿Cómo asegurar que cuando el elemento se selecciona y muestra como un solo elemento en el cuadro combinado, se mostrará como un valor de la propiedad ShortDescription mientras que el menú desplegable mostrará FullDescription ?

Actualización 2011-11-14

Recientemente me encontré con el mismo requisito de nuevo y no estaba muy contento con la solución que publiqué a continuación. Aquí hay una manera más agradable de obtener el mismo comportamiento sin volver a crear plantillas de ComboBoxItem . Utiliza un DataTemplateSelector

Primero, especifique el DataTemplate normal, el DataTemplate desplegable y el ComboBoxItemTemplateSelector en los recursos para el ComboBox . A continuación, haga referencia a ComboBoxItemTemplateSelector como DynamicResource para ItemTemplateSelector

            

ComboBoxItemTemplateSelector comprueba si el contenedor es el hijo de un ComboBoxItem , si es así, entonces estamos tratando con un elemento desplegable, de lo contrario, es el elemento en el ComboBox .

 public class ComboBoxItemTemplateSelector : DataTemplateSelector { public DataTemplate DropDownTemplate { get; set; } public DataTemplate SelectedTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { ComboBoxItem comboBoxItem = VisualTreeHelpers.GetVisualParent(container); if (comboBoxItem != null) { return DropDownTemplate; } return SelectedTemplate; } } 

GetVisualParent

 public static T GetVisualParent(object childObject) where T : Visual { DependencyObject child = childObject as DependencyObject; while ((child != null) && !(child is T)) { child = VisualTreeHelper.GetParent(child); } return child as T; } 

Solución antigua, requiere volver a plantillas de ComboBoxItem

                            

Esto resulta en el siguiente comportamiento

texto alternativo

No parece funcionar para mí ahora, pero este sí lo hace:

 public class ComboBoxItemTemplateSelector : DataTemplateSelector { public DataTemplate SelectedTemplate { get; set; } public DataTemplate DropDownTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var presenter = (ContentPresenter)container; return (presenter.TemplatedParent is ComboBox) ? SelectedTemplate : DropDownTemplate; } } 

Modifiqué este WPF ComboBox redondeado personalizado para mostrar un valor diferente del elemento seleccionado, así como cambiar el color de cada elemento.

ComboBox personalizado

Primero necesitas crear la estructura:

 //Structure public class COMBOITEM { string _ITEM_NAME; string _ITEM_SHORT_NAME; Brush _ITEM_COLOR; public string ITEM_NAME { get { return _ITEM_NAME; } set { _ITEM_NAME = value; } } public string ITEM_SHORT_NAME { get { return _ITEM_SHORT_NAME; } set { _ITEM_SHORT_NAME = value; } } public Brush ITEM_COLOR { get { return _ITEM_COLOR; } set { _ITEM_COLOR = value; } } } 

Inicializa la estructura, llénala de datos y vincúlala a ComboBox:

 private void Load_Data() { Brush Normal_Blue = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF1F4E79")); //Load first entry ObservableCollection _Line_Data = new ObservableCollection(); _Line_Data.Add(new COMBOITEM() { ITEM_NAME = "Line Number 1", ITEM_SHORT_NAME = "LN 1", ITEM_COLOR = Normal_Blue }); //Load Test Data for (int i = 2; i < 10; i++) { _Line_Data.Add(new COMBOITEM() { ITEM_NAME = "Line Number " + i.ToString(), ITEM_SHORT_NAME = "LN " + i.ToString(), ITEM_COLOR = (i % 2 == 0) ? new SolidColorBrush(Colors.Green) : new SolidColorBrush(Colors.Red) //This just changes color }); } //Bind data to combobox cb_Test.ItemsSource = _Line_Data; } 

Ahora coloque el ComboBox en su diseño. Para usarlo como un ComboBox normal, elimine DisplayMemberPath y cambie el nombre de "ColorComboBoxItem" por "CustomComboBoxItem":

  

Ahora agregue los siguientes estilos / plantilla a App.xaml Application.Resources:

            

Espero que esto ayude..

Otra opción que he encontrado es colocar un cuadro de texto sobre el área de texto del cuadro combinado. Haga un tamaño y alinéelo para que quede perfectamente sobre él y luego use un sub similar a este:

 Private Sub ComboBox*_Change() Dim T As String T = Left(ComboBox*.Text, 1) TextBox*.Value = T End Sub 

(reemplace el * con los números correspondientes), el resultado es que cuando se seleccione, el menú desplegable mostrará la lista como de costumbre, pero el cuadro de texto que se encuentra sobre él solo mostrará su primer carácter.

Espero que esto ayude.