如何在 WPF ComboBox 中为下拉列表值/所选项目显示不同的值?

2024-05-01

我有一个 WPF 组合框,绑定到具有长描述的项目列表。

绑定到 ComboBox 的类型具有短描述和长描述作为属性。目前,我受完整描述的约束。

comboBox.DisplayMemberPath = "FullDescription";

如何确保当项目被选择并在组合框中显示为单个项目时,它将显示为ShortDescription属性,同时下拉列表将显示FullDescription?


更新2011-11-14

我最近再次遇到同样的要求,我对下面发布的解决方案不太满意。这是一种更好的方法来获得相同的行为,而无需重新模板化ComboBoxItem。它使用一个DataTemplateSelector

首先,指定常规DataTemplate, 下拉菜单DataTemplateComboBoxItemTemplateSelector在资源中ComboBox。然后参考ComboBoxItemTemplateSelector as a DynamicResource for ItemTemplateSelector

<ComboBox ...
          ItemTemplateSelector="{DynamicResource itemTemplateSelector}">
    <ComboBox.Resources>
        <DataTemplate x:Key="selectedTemplate">
            <TextBlock Text="{Binding Path=ShortDescription}"/>
        </DataTemplate>
        <DataTemplate x:Key="dropDownTemplate">
            <TextBlock Text="{Binding Path=FullDescription}"/>
        </DataTemplate>
        <local:ComboBoxItemTemplateSelector
            x:Key="itemTemplateSelector"
            SelectedTemplate="{StaticResource selectedTemplate}"
            DropDownTemplate="{StaticResource dropDownTemplate}"/>
    </ComboBox.Resources>
</ComboBox>

ComboBoxItemTemplateSelector检查容器是否是 a 的子容器ComboBoxItem,如果是,那么我们正在处理一个下拉项,否则它是ComboBox.

public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate DropDownTemplate
    {
        get;
        set;
    }
    public DataTemplate SelectedTemplate
    {
        get;
        set;
    }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        ComboBoxItem comboBoxItem = VisualTreeHelpers.GetVisualParent<ComboBoxItem>(container);
        if (comboBoxItem != null)
        {
            return DropDownTemplate;
        }
        return SelectedTemplate;
    }
}

获取视觉父级

public static T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}

旧的解决方案,需要重新模板化ComboBoxItem

<SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />

<ControlTemplate x:Key="FullDescriptionTemplate" TargetType="ComboBoxItem">
    <Border Name="Border" Padding="2" SnapsToDevicePixels="true">
        <StackPanel>
            <TextBlock Text="{Binding Path=FullDescription}"/>
        </StackPanel>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsHighlighted" Value="true">
            <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

<ComboBox Name="c_comboBox" ItemsSource="{Binding}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=ShortDescription}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Template" Value="{StaticResource FullDescriptionTemplate}" />
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

这会导致以下行为

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WPF ComboBox 中为下拉列表值/所选项目显示不同的值? 的相关文章

随机推荐

  • 如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?

    背景 在 Linux 系统上 应用程序日志 https help ubuntu com community LinuxLogFiles Application Logs存在于子目录中 var log 其所有者为root root并且在我的系
  • 继承时字段冲突

    我有以下简化的模型结构 common models py class CLDate models Model active models BooleanField default True last modified models Date
  • 当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像

    我正在尝试制作绘图应用程序 您可以在画布上绘制一些内容 并通过单击 保存 按钮将结果保存为服务器上的图像 您还可以放置另一张图像作为绘图的背景 问题是 当我使用 ctx drawImage 将图像放入画布时 我无法将画布保存为图像 因为什么
  • resource.data 和 request.resource.data 是同一件事吗?

    我看了 Firebase 的官方指南 得到的印象是request resource data指向正在写入的新数据 但是 当我在模拟器中测试时 request resource data无论我发送什么都存在 并且始终等于resource da
  • NativeScript 中的多行文本框

    如何在本机脚本中获取支持多行的文本区域 我尝试过使用不支持多行的文本字段 还尝试过此代码将多行添加到文本字段 var myTextfield this page getViewById
  • NLog 最好的查看器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Woocommerce 编辑订单页面中显示可编辑的自定义字段值

    我不是开发人员 但以某种方式设法将 Woocommerce 自定义字段添加到结账和订单编辑页面 有类似的问题 但我找不到正确的解决方案 自定义字段在管理订单编辑页面中可见但他们不显示值并且不会添加到订单电子邮件中 我缺少什么 请看最后的截图
  • 如何编辑 Sublime Text 构建设置?

    我想启用 std gnu 11Sublime Text 3 的 C 单文件构建于 Ubuntu 12 04 上 我已经将工具链升级到最新的 g 并且不希望在每次构建时看到以下错误 错误 error 此文件需要编译器和库支持 ISO C 20
  • 在 lldb 中的“NSMutableArray *”PO 命令类型的对象上找不到属性“count”

    我正在使用控制台po一些变量 在这种情况下我有一个NSMutableArray 我想看看它的计数 我收到一个奇妙的错误 有任何想法吗 我知道我可以看到变量列表中的计数 它说 1个对象 但我在使用时似乎对多个获取器和属性有这个错误po 更新
  • 需要选定值的 jquery 自动完成字段?

    我需要一些 jquery 插件 因为他们在大多数航班预订网站上使用它 您必须从组合列表中选择出发 到达机场 我环顾四周 但找不到任何好的解决方案 我需要一个自动完成组合框 它将保持打开状态 直到用户从可能值列表中选择一个项目 并且它必须支持
  • 如何在 Github Action 中使用 Github 发布版本号

    我创建了一个 Github 存储库 其中包含构建 npm 包并将其发布到 npmjs com 的操作 我的行动的触发因素是在 Github 上创建一个新版本 创建新版本时 Github 要求我提供版本号 我很想在操作中使用这个版本号并将其提
  • 编码java Cookie值

    应如何对 Java Cookie 对象的实际值进行编码 我无法传递 等字符或 US ASCII 之外的任何字符 Br 乔因斯 如何并不重要 但通常Base64 http en wikipedia org wiki Base64应该可以正常工
  • 列出共享邮箱上的所有电子邮件及其附件名称

    我创建了一个非常简单的 powershell 脚本来收集有关共享邮箱文件夹上所有电子邮件的一些基本信息 Add type assembly Microsoft Office Interop Outlook out null olFolder
  • Xcode 8 配置文件无法下载

    I recently updated to Xcode 8 and as I click on download option next to provisioning profile in Xcode Preferences Accoun
  • 如何从 Visual Studio 代码中的窗口标题中删除新的搜索栏?

    VSCode 版本 1 81 0 macOS 版本 Ventura 13 2 1 使用的主题 Material 主题 过去这只是没有箭头图标的文本 如何恢复旧的视觉效果和行为 我永远不会单击此按钮来激活与 CMD P 相同的窗口 右键单击搜
  • 通过私钥使用 Python 进行 SSH

    在我的脚本中 我需要使用私钥通过 SSH 连接到远程系统 并将文件转储到其目录中 我用来 SSH 进入系统的命令是这样的 ssh i private key localhost 接下来是标准输入 输入密钥 private key 的密码 我
  • 反编译 C# .Net 1.1 应用程序的最佳工具 [重复]

    这个问题在这里已经有答案了 可能的重复 net 反汇编器 反编译器 https stackoverflow com questions 578883 a net disassembler decompiler 是否有 NET Reflect
  • Google Drive:如何使用 Python SDK 转让所有权?

    我设置了一个服务帐户来复制用户上传的文件 如何将所有权转移到其他电子邮件地址 I have new permission value email protected cdn cgi l email protection type user
  • 如何在Qt WebKit中将网页保存为“另存为完整网页”

    我需要使用 Qt WebKit 保存网页 类似于 另存为完整网页 以下是我的要求 保存索引html文件 维护实体编码 需要下载所有链接的图像和其他资源 需要将html页面中的资源路径更改为本地下载路径 需要维护网页当前状态 我可以使用 Qt
  • 如何在 WPF ComboBox 中为下拉列表值/所选项目显示不同的值?

    我有一个 WPF 组合框 绑定到具有长描述的项目列表 绑定到 ComboBox 的类型具有短描述和长描述作为属性 目前 我受完整描述的约束 comboBox DisplayMemberPath FullDescription 如何确保当项目