ComboBox的下拉列表中的项目和所选项目的不同模板

Mat*_*ský 13 wpf xaml datatemplate

我有一个ComboBox相当复杂的单个项目模板,其中包括两个图像和几行文本:

在此输入图像描述

但是,ComboBox本身所选项目无法正确显示,因为垂直空间太有限(我无法使其更高,因为它是a的一部分ToolBar).

如何让ComboBox为ComboBox自己显示的项目使用不同的模板?(默认ToString表示会很好)

谢谢!

H.B*_*.B. 28

所选项目(在ComboBox本身,而不是下拉列表中)不在内部,ComboBoxItem因此您可以执行以下操作:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <ContentControl Content="{Binding}">
            <ContentControl.Style>
                <Style TargetType="{x:Type ContentControl}">
                    <!-- Complex default template -->
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Image Source="{Binding XPath=media:thumbnail/@url}" Width="100" Height="100" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <!-- Simple selection box template -->
                        <DataTrigger
                                Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}}"
                                Value="{x:Null}">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding XPath=title}" />
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
    </DataTemplate>
</ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

(编辑:请注意,选择框中的绑定会抛出错误,因为RelativeSource找不到.有各种绕过这个的选项,一个是自定义值转换器返回truefalse取决于祖先是否存在(手动树行走) .)


Sin*_*atr 7

我正在寻找这个问题的标准(不是hacky,没有绑定错误)解决方案.我在这里找到:使用DataTemplateSelector.

这与@HB答案的想法相同:只要ComboBoxItem在可视树中有父作为父母,就检查.

public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate SelectedTemplate { get; set; }
    public DataTemplate DropDownTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        while (container != null)
        {
            container = VisualTreeHelper.GetParent(container);
            if (container is ComboBoxItem)
                return DropDownTemplate;
        }
        return SelectedTemplate;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

<ComboBox.ItemTemplateSelector>
    <local:ComboBoxItemTemplateSelector>
        <local:ComboBoxItemTemplateSelector.SelectedTemplate>
            <DataTemplate>
                ... simple template for selected item
            </DataTemplate>
        </local:ComboBoxItemTemplateSelector.SelectedTemplate>
        <local:ComboBoxItemTemplateSelector.DropDownTemplate>
            <DataTemplate>
                ... complex template used by dropdown items
            </DataTemplate>
        </local:ComboBoxItemTemplateSelector.DropDownTemplate>
    </local:ComboBoxItemTemplateSelector>
</ComboBox.ItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud)