c# WPF AutoCompleteBox -类似的命名项返回列表中的第一个匹配项
本文关键字:返回 列表 第一个 AutoCompleteBox WPF -类 | 更新日期: 2023-09-27 18:09:38
我有一个AutoCompleteBox,我使用ProductCode搜索。autocompletebox的项目源是一个列表List<Product>
,其中Product具有以下属性:ProductCode,ProductID,ProductBrandCode。
这一切都工作得很好,除了当我试图检索SelectedItem属性时,所选产品具有相同的ProductCode作为列表中的另一个产品。
例如,假设我有6个产品:
ProductID | ProductCode | ProductBrandCode
1 t1 abc
2 t34 zyx
3 test123 abc
4 test123 zxc
5 test123 asd
6 t23 asd
如果我选择第5个产品(ID为5),SelectedItem返回ID = 3的产品。如果我选择id=4的产品,也会发生同样的事情,我总是得到与ProductCode匹配的第一个产品。我假设这是由于我的ValueMemberPath被设置为ProductCode,在这种情况下不是唯一的,并且autoCompleteBox以某种方式拾取第一个匹配的ProductCode。如果我在列表中选择一个没有重复ProductCode的产品,它就会工作得很好。
xaml:
<my:AutoCompleteBox x:Name="autoTxtBoxProductCode"
verticalAlignment="Top" HorizontalAlignment="Left"
Height="25" Margin="116,10,0,0"
Width="144" Background="#FFEDF4AB"
TabIndex="2001" IsTabStop="True"
Populating="AutoBoxPopulateProductCode"
ValueMemberPath="ProductCode"
Style="{StaticResource autoTextBoxInError}"
Validation.Error="Validation_Error"
PreviewKeyUp="autoTxtBoxProductCode_PreviewKeyUp"
IsTextCompletionEnabled="False" MinimumPrefixLength="2"
Text="{Binding Path=ProductCode,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=true,
NotifyOnValidationError=true,
Mode=TwoWay}"
SelectedItem="{Binding Path=ProductID}">
<my:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ProductBrandCode}"
FontWeight="Bold"
Foreground="Black"
Width="65" FontSize="14"/>
<TextBlock Text="{Binding ProductCode}"
Foreground="Black"/>
</StackPanel>
</DataTemplate>
</my:AutoCompleteBox.ItemTemplate>
</my:AutoCompleteBox>
在我的代码中,我像这样检索选中的项目:
private void autoTxtBoxProductCode_PreviewKeyUp(object sender, KeyEventArgs e)
{
Product prd = (Product)(autoTxtBoxProductCode.SelectedItem);
MessageBox.Show(prd.ProductID.ToString());
}
有办法解决这个问题吗?
我也遇到了同样的问题。问题是当下拉菜单关闭时,框再次更新所选项目。所以我在我自己的AutoCompleteBox中抑制了这个事件。
class CustomAutoCompleteBox : System.Windows.Controls.AutoCompleteBox
{
private bool dropDown = false;
protected override void OnDropDownOpening(System.Windows.Controls.RoutedPropertyChangingEventArgs<bool> e)
{
base.OnDropDownOpening(e);
dropDown = false;
}
protected override void OnDropDownClosing(System.Windows.Controls.RoutedPropertyChangingEventArgs<bool> e)
{
base.OnDropDownClosing(e);
dropDown = true;
}
protected override void OnSelectionChanged(System.Windows.Controls.SelectionChangedEventArgs e)
{
if (!dropDown)
base.OnSelectionChanged(e);
else
dropDown = false;
}
}
我希望我能帮到你。
编辑:我忘了重置ondropdownoopening事件