永远不会调用WPF ComboBox ItemTemplateSelector.Selecttemplate

时间:2018-03-14 13:26:49

标签: wpf templates combobox

基于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;
    }
}

现在的问题是,即使我检查了所有SelectTemplateDynamicResource StaticResource也不会被称为

1 个答案:

答案 0 :(得分:0)

您需要将ComboBoxItemTemplateSelector分配给ComboBox,如下所示:

<ComboBox ItemTemplateSelector="{DynamicResource ComboBoxItemTemplateSelector}">

并且您无法设置永远不会调用DisplayMemberPathSelectTemplate方法。