1

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

この問題を回避する方法はありますか?

4

1 に答える 1

0

私も同じ問題を抱えていました。問題は、ドロップダウンがボックスを閉じているときに、選択したアイテムが再び更新されることです。だから私は自分の 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 イベントをリセットするのを忘れました。

于 2014-03-25T09:51:05.153 に答える