WPF IsEditable=true 填充了对象的 ComboBox 将 ToString() 显示为选定项
Posted
技术标签:
【中文标题】WPF IsEditable=true 填充了对象的 ComboBox 将 ToString() 显示为选定项【英文标题】:WPF IsEditable=true ComboBox filled with objects displays the ToString() as the selected item 【发布时间】:2010-12-23 02:00:03 【问题描述】:Wpf 组合框允许编辑,如果您的所有组合框项都是字符串,或者在它们上定义了 ToString() 方法,这很好。
当您选择一个项目时,它显示为文本,它不使用 DataTemplate,它只是在所选项目上调用 ToString()。
我在组合下拉列表中获得了使用我的项目模板格式化的项目列表,当我选择一个时,我得到对象的名称,即 MyNamespace.MyObjectName
已经解决了一些问题
使用 ValuePath 绑定到属性 在对象上,但如果你需要 您的显示器不止一个 这些,倒霉。 实现 ToString() 方法 你的对象还有其他方法吗?
【问题讨论】:
是的,第二种方法效果很好。 【参考方案1】:您可以使用IValueConverter 将“对象”转换为字符串值并返回。有关详细信息,请参阅 IValueConverter 链接中的示例代码。
【讨论】:
感谢您的回答,伙计,我觉得自己像个白痴,我知道这一点。周五我会怪罪它。 :) 我多次使用转换器,你会将这个转换器放在哪里,而不是 ItemsSource 属性,我尝试了 SelectedItem 属性并且转换器被命中,但是当我返回一个字符串时,我仍然得到 MyNamespace .MyObjectName,你以前用组合框试过吗? 查看链接中的示例。它向您展示了如何使用带有组合框的转换器(通过组合框 ItemsTemplate)。【参考方案2】:您可以完全在 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 中的文本框显示您想要的任何属性。 绝对黄金。附加的属性每次都能吸引我,因为它很容易让我不知道它们。谢谢。 OMG 我希望我能多次对此表示赞同。我也希望它在我搜索“WPF ComboBox SelectedValuePath ToString”时出现——希望在评论中提及它们将有助于其他一些可怜的树液不要追他的尾巴 2 小时试图在未来弄清楚这一点。使用大型框架的一半战斗是学习如何像设计框架的人一样思考(假设你不能只记住整个庞大的框架。;-))我肯定在这个“错误”的方向上思考. 如果您在该数据模板中使用多个绑定属性怎么办。我在我的身上试过了,现在当你从下拉列表中选择一些东西时,它只显示我设置为 TextSearch.TextPath 的路径。下拉列表中的项目正确显示,但所选项目显示只是我使用的 TextPath。以上是关于WPF IsEditable=true 填充了对象的 ComboBox 将 ToString() 显示为选定项的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式 ComboBox VirtualizingStackPanel WPF