在 WPF / C# 中选择绑定项目后维护组合框文本
Posted
技术标签:
【中文标题】在 WPF / C# 中选择绑定项目后维护组合框文本【英文标题】:Maintaining combobox text after selecting a bound item in WPF / C# 【发布时间】:2020-08-03 02:36:13 【问题描述】:我有一个用于搜索名称的 WPF ComboBox。我使用 MVVM 模式,这一切都很简单:
ComboBox Text 属性绑定到 VM 上的“SearchString”属性。 ComboBox ItemsSource 绑定到 VM 上的“SearchResult”属性。这是使用 DataTemplate 显示的对象列表。 ComboBox 还触发“PreviewKeyDown”事件,按 Enter 选择结果集中的第一项,向上和向下箭头键遍历结果。 SelectedItem 绑定到 GroupBox 的 DataContext。这部分效果非常好。
当在 ComboBox 中选择一个项目时,WPF 会自动尝试用我的 SelectedItem 替换“文本”。这会导致我的结果集被清空并且“文本”恢复为空字符串。
The behaviour I'd like is that when an item is selected, the text in the ComboBox remains exactly the same, so that my user can continue to traverse the result set using up and down arrows .
有没有一种优雅的方法来实现这一点?我认为代码 sn-p 不会在问题中添加任何内容,但如果需要,我们很乐意提供。
【问题讨论】:
简短回答:否。Text
属性与所选项目同步,您应该绑定到SelectedItem
或真正使用其他自定义控件。
如果没有 xaml/code,您的设置将不清楚。见minimal reproducible example。不清楚您想要什么:考虑添加几个场景(屏幕截图?),您可以在其中逐步解释正在发生的事情以及您想要的方式。
【参考方案1】:
The behaviour I'd like is that when an item is selected, the text in the ComboBox remains exactly the same, so that my user can continue to traverse the result set using up and down arrows.
这是ComboBox
控件中未内置的要求。如果你想要这样的东西,你必须自己构建它(并且子类化很可能无济于事,你必须为此从头开始构建大部分ComboBox
)。
事实上,您也不应该像那样绑定当前项目,您应该使用 SelectedItem
属性,它不会进行任何转换或复制,这正是您想要的内部绑定。
【讨论】:
谢谢 - 这是一种恐惧,因为我现在当然没有足够的经验来构建控件。不过,很高兴知道不要浪费我的时间来说服这样做。以上是关于在 WPF / C# 中选择绑定项目后维护组合框文本的主要内容,如果未能解决你的问题,请参考以下文章
在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid