Как отобразить другое значение для выпадающего списка значений / выбранного элемента в WPF ComboBox?

У меня есть combobox WPF, связанный со списком элементов с длинными описаниями.

Тип, связанный с ComboBox, имеет как короткое, так и длинное описание как свойства. В настоящее время я связываюсь с полным описанием.

comboBox.DisplayMemberPath = "FullDescription"; 

Как убедиться, что, когда элемент выбран и отображается как отдельный элемент в combobox, он будет отображаться как значение свойства ShortDescription то время как в раскрывающемся FullDescription будет отображаться FullDescription ?

    Обновление 2011-11-14

    Недавно я пришел к такому же требованию, и я был не очень доволен решением, которое я разместил ниже. Вот более удобный способ получить такое же поведение без изменения шаблона ComboBoxItem . Он использует DataTemplateSelector

    Сначала укажите регулярные DataTemplate , раскрывающийся DataTemplate и ComboBoxItemTemplateSelector в ресурсах для ComboBox . Затем DynamicResource на ComboBoxItemTemplateSelector как DynamicResource для ItemTemplateSelector

                

    ComboBoxItemTemplateSelector проверяет, является ли контейнер дочерним элементом ComboBoxItem , если это так, то мы имеем дело с выпадающим элементом, иначе это элемент в 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; } 

    Старое решение требует изменения шаблона ComboBoxItem

                                

    Это приводит к следующему поведению

    alt text

    Кажется, теперь это не работает для меня, но это делает:

     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; } } 

    Я изменил этот пользовательский округленный WPF ComboBox, чтобы отобразить другое значение из выбранного элемента, а также изменить цвет для каждого элемента.

    Пользовательский ComboBox

    Сначала вам нужно создать структуру:

     //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; } } } 

    Инициализируйте структуру, заполните ее данными и привяжите к 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; } 

    Теперь разместите ComboBox в своем дизайне. Чтобы использовать его как обычный ComboBox, удалите DisplayMemberPath и переименуйте «ColorComboBoxItem» в «CustomComboBoxItem»:

      

    Теперь добавьте следующие стили / шаблоны в App.xaml Application.Resources:

                

    Надеюсь, это поможет..

    Другой вариант, который я нашел, – это разместить текстовое поле над областью текстового поля. Измените размер и выровняйте его так, чтобы он отлично лежал над ним, а затем подошел к нему так:

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

    (замените * соответствующими номерами), результат состоит в том, что при выборе раскрывающегося списка будет отображаться список как обычно, но лежащее над ним текстовое поле будет показывать только его первый символ.

    Надеюсь это поможет.

    Давайте будем гением компьютера.