WPF中IsEditable=true的ComboBox填充了对象,显示ToString()作为所选项目

20
组合框允许编辑,如果所有的组合框项都是字符串,或者它们上面定义了一个ToString()方法,那么这很好。

当您选择一个项目时,它会显示为文本,它不使用DataTemplate,只是调用所选项目的ToString()方法。

我获得下拉框中的项目列表是使用我的项模板格式化的,当我选择一个项目时,我得到对象的名称,即 MyNamespace.MyObjectName

一些解决方案已经提出:

  • 使用ValuePath绑定到对象上的属性,但如果要求显示多个这样的属性,那就没戏了。
  • 在您的对象上实现ToString()方法

还有其他解决方法吗?


是的,第二种方法完美地运行。 - Aran Mulholland
2个回答

37

您可以完全在XAML中实现此操作

<ComboBox IsTextSearchEnabled="True" IsEditable="True"
        ItemsSource="{Binding MyObjectCollection}"
        TextSearch.TextPath="MyObjectName">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyObjectName}" />
        </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

优点是您可以在XAML中定义和更改此内容,而无需任何代码后台。将ItemsSource绑定到对象集合,然后设置基于其路径的搜索路径为TextSearch.TextPath。然后,在自定义的ItemTemplate内部,您可以将TextBlock绑定到对象ToString方法之外的其他内容。


忘记提醒了,关键在于保留您的DataTemplate。TextSearch.TextPath附加属性是使ComboBox中的文本框显示您想要的任何属性的方法。 - sidney.andrews
1
绝对的黄金。附加属性每次都让我措手不及,因为很容易忽略它们。谢谢。 - Aran Mulholland
天啊,我希望我可以给这个点赞不止一次。我也希望当我搜索“WPF ComboBox SelectedValuePath ToString”时能够找到它 - 希望在评论中提到它们可以帮助其他可怜的人不必再浪费两个小时来解决这个问题。使用大型框架的一半挑战是学习如何像设计框架的人一样思考(假设你不能仅仅记住整个庞大的框架。;-))我肯定是以“错误”的方向思考这个问题的。 - Rick Riensche
2
如果您在该DataTemplate中使用了多个绑定属性,会出现什么情况?我在我的项目中尝试过,现在当您从下拉列表中选择某些内容时,它只显示我设置为TextSearch.TextPath的路径。下拉列表中的项目正常显示,但所选项目仅显示我使用的TextPath。 - Cody W Hageman

3
你可以使用 IValueConverter 将 "object" 转换为字符串值并进行反向转换。有关详细信息,请参阅 IValueConverter 链接中的示例代码。

谢谢你的回答,我感觉自己像个白痴,我本来就知道这个。我会把它归咎于星期五。 :) - Aran Mulholland
我经常使用转换器,你会把这个转换器放在哪里?不要放在ItemsSource属性上,我已经尝试过放在SelectedItem属性上,转换器被调用了,但是当我返回一个字符串时,仍然得到MyNamespace.MyObjectName,你以前尝试过在ComboBox中使用吗? - Aran Mulholland
请查看链接中的示例。它向您展示了如何使用转换器与组合框(通过组合框的ItemsTemplate)。 - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接