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());
  }

有办法解决这个问题吗?

c# WPF AutoCompleteBox -类似的命名项返回列表中的第一个匹配项

我也遇到了同样的问题。问题是当下拉菜单关闭时,框再次更新所选项目。所以我在我自己的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事件