WPF:如何在 ComboBox 中自定义 SelectionBoxItem

标签 wpf templates combobox customization

我想将自定义模板/项目显示为组合框中的选定项目(该项目实际上并不存在于项目列表中,并且以不同方式更新)。这甚至不需要是一个项目,只需提供自定义 View 即可。

如何在保持当前 ComboBox 主题的情况下执行此操作(因此无法替换 ControlTemplate)?据我所知,所有 SelectionBox* 属性都不可编辑,并且 ComboBox 内部使用未命名的 ContentPresenter。

最佳答案

我会这样做:

<Window.Resources>

  <DataTemplate x:Key="NormalItemTemplate" ...>
    ...
  </DataTemplate>

  <DataTemplate x:Key="SelectionBoxTemplate" ...>
    ...
  </DataTemplate>

  <DataTemplate x:Key="CombinedTemplate">
    <ContentPresenter x:Name="Presenter"
       Content="{Binding}"
       ContentTemplate="{StaticResource NormalItemTemplate}" />
    <DataTemplate.Triggers>
      <DataTrigger
        Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}"
        Value="{x:Null}">
        <Setter TargetName="Presenter" Property="ContentTemplate"
                Value="{StaticResource SelectionBoxTemplate}" />
      </DataTrigger>
    </DataTemplate.Triggers>
  </DataTemplate>

</Window.Resources>

...

<ComboBox
  ItemTemplate="{StaticResource CombinedTemplate}"
  ItemsSource="..."
  ... />

这样做的原因是 CombinedTemplate 通常只使用 NormalItemTemplate 来呈现其数据,但如果没有 ComboBoxItem 祖先,它会假设它位于选择框中,因此它使用 SelectionBoxTemplate。

请注意,这三个 DataTemplate 可以包含在 ResourceDictionary 的任何级别中(不仅仅是在 Window 级别),甚至可以直接包含在ComboBox,取决于您的偏好。

关于WPF:如何在 ComboBox 中自定义 SelectionBoxItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214696/

相关文章:

c# - 是否可以在 WPF 中处理键盘/鼠标事件应用程序?

c++ - 递归模板定义

c++ - 调用模板显式实例化时如何开启自动匹配?

excel - 为一个 sub 下的多个 activex 组合框运行相同的更改事件

vba - 将宏分配给组合框

c# - 如何以编程方式更改/替换模板中的 StoryBoard?

c# - 面向 WPF/XAML 文盲的学习资源

WPF StaticResource 绑定(bind)到子属性

templates - 我怎样才能让免费的 Pascal 编译器 xcode 模板与 xcode 4 一起工作

extjs - QTP 脚本无法识别组合框对象