【问题标题】:WPF ComboBox ItemTemplateSelector.Selecttemplate is never calledWPF ComboBox ItemTemplateSelector.Selecttemplate 永远不会被调用
【发布时间】: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 问题和答案应仅包含基本内容。

标签: wpf templates combobox


【解决方案1】:

您需要像这样将ComboBoxItemTemplateSelector 分配给ComboBox

<ComboBox ItemTemplateSelector="{DynamicResource ComboBoxItemTemplateSelector}">

你不能设置DisplayMemberPath 否则SelectTemplate 方法将永远不会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2013-10-12
    • 2012-03-27
    • 2013-08-29
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多