WPF ComboBox - 在选择值时显示不同的内容

Gus*_*nti 7 data-binding wpf combobox

我需要完成的是一个显示People的ComboBox.当您展开下拉列表时,它会显示FirstName和LastName,但是当您选择一个人时,组合框中显示的值应该只是该人的名字.

我有以下ItemTemplate:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}" />
            <TextBlock Text=" " />
            <TextBlock Text="{Binding LastName}" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

当选择一个项目时,我还应该做什么才能显示第一个名字?

谢谢!

编辑

稍微改变了一个问题:如果我有人的照片而不是在选择一个人时只显示第一个名字怎么办,我只想显示照片.换句话说,我怎样才能有两个单独的模板 - 一个用于下拉列表,另一个用于所选项目?

Ole*_*lik 18

这是解决方案:

    <ComboBox>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <ContentControl x:Name="content" Content="{Binding}" ContentTemplate="{StaticResource ComplexTemplate}"/>
                </StackPanel>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBoxItem}}" Value="{x:Null}">
                        <Setter TargetName="content" Property="ContentTemplate" Value="{StaticResource SimpleTemplate}"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
Run Code Online (Sandbox Code Playgroud)

基本上,您在此处再创建一层DataTemplate.ComboBox'es ItemTemplate始终保持不变.但该模板中的内容会根据您感兴趣的条件进行调整.

将下拉组合项与选区组合框项区分开的技巧是,选择区域实际上并未包含在ComboBoxItem对象中,它是ComboBox控件本身的一部分.因此,ComboBoxItem的FindAncestor返回null,我们在上面的触发器中使用它.


Gus*_*nti 6

我知道了.我只需要将以下内容添加到我的ComboBox:

IsEditable="True" IsReadOnly="True" TextSearch.TextPath="FirstName"
Run Code Online (Sandbox Code Playgroud)


Cha*_*lie 5

在DataTemplate上放置一个触发器.触发器应检查IsSelected属性(DataTemplate将需要为此设置TargetType).如果选中它,则可以将TextBlocks的可见性设置为折叠,并将图像的可见性设置为可见.然后针对未选择的情况执行相反的操作.