【发布时间】:2023-03-13 02:46:01
【问题描述】:
基于this answer,我尝试使用以下代码实现ComboBox,根据下拉菜单是否打开,使用不同的模板。
ComboBox 定义如下所示:
<ComboBox SelectedValuePath="Id"
DisplayMemberPath="Name">
<ComboBox.Resources>
<DataTemplate x:Key="SelectedTemplate">
<TextBlock Text="Abbreviation" />
</DataTemplate>
<DataTemplate x:Key="DropDownTemplate">
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}, Path=ActualWidth, Mode=OneTime}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=DisplayMemberPath}" />
<TextBlock Grid.Column="1"
Text="Abbreviation" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
<infrastructure:ComboBoxItemTemplateSelector x:Key="ComboBoxItemTemplateSelector"
DropDownDataTemplate="{StaticResource DropDownTemplate}"
SelectedDataTemplate="{StaticResource SelectedTemplate}" />
</ComboBox.Resources>
</ComboBox>
ComboBoxItemTemplateSelector 看起来像这样:
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public DataTemplate DropDownDataTemplate { get; set; }
public DataTemplate SelectedDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return DependencyObjectHelper.GetVisualParent<ComboBoxItem>(container) != null ? this.DropDownDataTemplate : this.SelectedDataTemplate;
}
}
现在的问题是,尽管我检查了所有 DynamicResources 和 StaticResources,但不知何故 SelectTemplate 从未被调用。
【问题讨论】:
-
不要设置 DisplayMemberPath。并将 ComboBoxItemTemplateSelector 的实例分配给 ComboBox 的 ItemTemplateSelector 属性。
-
@Clemens 感谢您对我的回答进行编辑。只是出于好奇,您为什么删除提到它基本上只是您已经说过的部分?我只是想给你点赞,这不是坏事或任何事情。
-
@Thomas 我认为没有必要这样做。 IMO 问题和答案应仅包含基本内容。