我可以让 WPF 组合框将子字符串视为新值吗?
本文关键字:字符串 新值吗 WPF 组合 我可以 | 更新日期: 2024-11-08 19:46:48
我正在使用由以下定义的组合框:
<ComboBox Grid.Column="2" Height="29" HorizontalAlignment="Left" Margin="137,192,0,0" Name="componentsComboBox" VerticalAlignment="Top" Width="224"
IsEditable="True"
TextSearch.TextPath="Name">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
..以按对象的"名称"属性显示对象列表。 我观察到以下行为:
- 单击下拉列表中的某个项目,然后组件组合框.选定值(和 .选定项)对应于单击的项目。还行!
- 开始键入项目的名称,自动完成会在您键入时填写,.选定值(和 .选定项)对应于自动完成的项。 伟大!
- 开始键入项目的名称,自动完成会在您键入时填写,点击删除以仅截断为您实际键入的内容。选定值和 .选定项仍对应于自动完成项。 不!糟糕的WPF!坏!
- 与 3 类似的行为,如果从文本框部分的末尾删除字符
本质上,如果我有一个包含两个对象的列表,例如,
{ new Component() { Name = "COMPONENT1"},
new Component() { Name = "COMPONENT2"} }
我想要这些值:
- COMPONENT1
- COMPONENT2
出现在下拉部分中,如果用户输入"COMP",我想识别他们输入了新值,但正如它所代表的那样,控件看起来像他们选择了COMPONENT1。
我在这里错过了什么?
您可以通过
分别将IsEditable和IsReadOnly属性设置为True和False,在WPF中轻松执行此操作。
编号: http://msdn.microsoft.com/en-us/library/system.windows.controls.combobox.iseditable.aspx
例如,如何允许用户在 WPF 中的组合框中编辑文本?
<Window x:Class="LearnWPF.EditableComboBox.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LearnWPF.EditableComboBox" Height="300" Width="300"
>
<Window.Resources>
<XmlDataProvider x:Key="items" XPath="//item">
<x:XData>
<items xmlns="">
<item>01</item>
<item>02</item>
<item>03</item>
</items>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<ComboBox IsEditable="True" DataContext="{StaticResource items}"
ItemsSource="{Binding}"/>
</Grid>
</Window>
我今天经历了这种行为,并同意从表面上看,这似乎是一个错误。 不过,深入挖掘会发现一些灰色地带。
我认为这里发生的事情是,每次更新文本框时,控件都会运行前缀匹配算法,而不管导致文本框更新的击键如何。 因此,当您删除文本的自动完成部分时,前缀匹配算法仍与控件的 ItemsSource 中的项匹配;该控件不会尝试推断最终用户刚刚删除了自动完成的部分,因此算法不应运行。
回复:您对 akjoshi 响应的评论,当您删除"2"时,在组合框的文本框中只留下"0",前缀匹配算法正确匹配"01"项。
我使用的解决方法是仅绑定到 ComboBox 的 Text 属性,并基于该属性构建所有视图模型逻辑。 SelectedItem、SelectedIndex 和 SelectedValue 完全没有绑定。