我有一个AutoCompleteBox,我使用ProductCode进行搜索。自动填充框的项目源是一个列表List<Product>
,其中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。如果我选择列表中没有重复的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());
}
有没有解决这个问题的方法? 非常感谢!
答案 0 :(得分:0)
我遇到了同样的问题。问题是当DropDown关闭时,框会再次更新所选项目。所以我在自己的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;
}
}
我希望我能帮到你。
编辑:我忘记了要重置的OnDropDownOpening事件。