WPF Combobox:文本框和下拉列表中的不同模板

这是我的combobox。

     

如何更改它,以便只有FullName出现在combobox的文本框部分中,而所有三列仍然出现在下拉部分?

不幸的是, SelectionBoxItemTemplate是一个只读属性,所以我们需要做更多的工作。 通过将ItemTemplate作为选择时项目的显示方式,可以编辑ItemContainerStyle以提供包含要显示的其他字段的ControlTemplate

           

对于ComboBoxItem模板,我只修改了默认模板,因此它应该是完全正常的。

如果ComboBox的IsEditable属性设置为True,则可以将ComboBox的“TextSearch.TextPath”属性设置为要显示的属性名称。 所以在你的情况下:

  

我没有使用只读的SelectionBoxItemTemplate属性,而是创建了一个新的(附加的,可写的)属性,并使用了我的风格。 我还为我的风格添加了一个触发器,以便不破坏所有未使用我的新附加属性的combobox…

像这样用它:

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

您只需将此类添加到项目中:

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

并更改您的ComboBox样式以使用SelectionBoxAltTemplate附加属性(如果设置)(或因为我无法将触发器设置为“not null”),如果附加的为null,则将其设置回默认的SelectionBoxItemTemplate:

ComboBox样式的ControlTemplate中的ContentPresenter:

  

并且触发器在没有附加属性的情况下向ComboBoxed提供向后兼容性:

     ...  

完整风格:

  

但是,这可能不适用于ItemTemplateSelctors,只能使用一个模板 – 但您可以轻松添加附加属性“SelectionBoxAltTemplateSelector”,它提供选择器并将其传递给样式。

如果您不想更改ComboBox样式,那么您的问题可以得到很好的答案: https : //stackoverflow.com/a/2277488/1070906

它在DataTemplate中使用Trigger,它在可视树中查看上面某处的ComboBoxItem,而在选择框中则不是这种情况。