ProductCode を使用して検索する AutoCompleteBox があります。オートコンプリート ボックスのアイテム ソースは、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());
}
この問題を回避する方法はありますか?