我有一个AutoCompleteBox,可以使用ProductCode进行搜索。自动完成框的项目来源是列表List<Product>
,其中产品具有以下属性:ProductCode,ProductID,ProductBrandCode。
这一切都很好,除了当所选产品与列表中的另一个产品具有相同的ProductCode时,当我尝试检索SelectedItem属性时。
例如,假设我有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。如果我选择的列表中没有重复的产品代码,则效果很好。
这是它在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());
}
是否有解决此问题的方法?
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;
}
}
希望我能为您提供帮助。
编辑:我忘记了要重置的OnDropDownOpening事件。