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