Combobox de WPF: Plantilla diferente en el cuadro de texto y en la lista desplegable

Este es mi cuadro combinado.

     

¿Cómo puedo cambiarlo para que solo FullName aparezca en la parte de la caja de texto del cuadro combinado mientras que las tres columnas aún aparecen en la parte desplegable?

Desafortunadamente, SelectionBoxItemTemplate es una propiedad de solo lectura, por lo que tenemos que trabajar un poco más. Al hacer que ItemTemplate sea ​​la forma en que desea que aparezca el elemento cuando se selecciona, puede editar ItemContainerStyle para proporcionar una ItemContainerStyle de ItemContainerStyle que incluya los otros campos que desea mostrar.

           

Para la plantilla ComboBoxItem , acabo de modificar la predeterminada, por lo que debería ser completamente funcional.

Si la propiedad IsEditable de ComboBox está establecida en True, puede establecer la propiedad “TextSearch.TextPath” del ComboBox en el nombre de la propiedad que desea mostrar. Entonces en tu caso:

  

En lugar de usar la propiedad de solo lectura SelectionBoxItemTemplate, creé una propiedad nueva (adjunta, escribible) y la utilicé en mi estilo. También agregué un disparador a mi estilo para no romper todos los cuadros combinados que no están usando mi nueva propiedad adjunta …

Úselo así:

    ... Template for the selection box ...     ... Template for the popup ...    

Solo tienes que agregar esta clase a tu proyecto:

 public class ComboBoxSelectionBoxAltTemplateBehaviour { public static readonly DependencyProperty SelectionBoxAltTemplateProperty = DependencyProperty.RegisterAttached( "SelectionBoxAltTemplate", typeof (DataTemplate), typeof (ComboBoxSelectionBoxAltTemplateBehaviour), new PropertyMetadata(default(DataTemplate))); public static void SetSelectionBoxAltTemplate(DependencyObject element, DataTemplate value) { element.SetValue(SelectionBoxAltTemplateProperty, value); } public static DataTemplate GetSelectionBoxAltTemplate(DependencyObject element) { return (DataTemplate) element.GetValue(SelectionBoxAltTemplateProperty); } } 

y cambie su estilo de ComboBox para usar la propiedad adjunta SelectionBoxAltTemplate si se establece (o porque no pude establecer un desencadenante como “no nulo”, lo configuré de nuevo en SelectionBoxItemTemplate por defecto si el adjunto es nulo):

El ContentPresenter dentro de ControlTemplate del Estilo ComboBox:

  

Y el Trigger para proporcionar compatibilidad hacia atrás a ComboBoxed sin la propiedad adjunta:

     ...  

Estilo completo:

  

Sin embargo, esto podría no funcionar con ItemTemplateSelctors, solo con una sola plantilla, pero podría agregar fácilmente una propiedad adjunta “SelectionBoxAltTemplateSelector” que proporciona el selector y lo pasa al estilo.

Esta es una buena respuesta a su pregunta si no desea cambiar el estilo de ComboBoxes: https://stackoverflow.com/a/2277488/1070906

Utiliza un desencadenador en el DataTemplate que mira si hay un ComboBoxItem en algún lugar arriba en el árbol visual, que no es el caso en el cuadro de selección.