2013-04-17 3 views
1

ProductCode를 사용하여 검색하는 AutoCompleteBox가 있습니다. autocompletebox의 항목 소스는 제품 List<Product> 목록이며 Product에는 ProductCode, ProductID, ProductBrandCode 속성이 있습니다.WPF AutoCompleteBox - 목록에서 첫 번째 일치 항목을 반환하는 simillar 명명 된 항목

선택한 제품의 목록에있는 다른 제품과 동일한 ProductCode가있는 경우 SelectedItem 속성을 검색하려고 할 때를 제외하고 모두 정상적으로 작동합니다.

그래서 예를 들어, 내가 6 개 제품이 있다고 할 수 있습니다 : 내가 선택한 경우 내가 5 제품 (5 ID)을 선택하면

ProductID | ProductCode | ProductBrandCode 
1    t1    abc 
2    t34    zyx 
3    test123   abc 
4    test123   zxc 
5    test123   asd 
6    t23    asd 

을의 selectedItem가이 ID와 제품을 반환 = 3 같은 일이 발생 id = 4 인 제품은 항상 ProductCode와 일치하는 첫 번째 제품을 얻습니다. 나는 이것이 ValueMemberPath가 ProductCode로 설정되었다는 사실에 기인한다고 가정하고 있습니다.이 경우에는 마녀가 유일하지 않고 autoCompleteBox가 처음으로 일치하는 ProductCode를 선택합니다. 목록에 중복되는 ProductCode가없는 제품을 선택하면 완벽하게 작동합니다.

<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> 

그리고 내 코드에서 나는 다음과 같이 선택한 항목을 검색 :

이는 XAML에서 모습입니다

private void autoTxtBoxProductCode_PreviewKeyUp(object sender, KeyEventArgs e) 
    { 
    Product prd = (Product)(autoTxtBoxProductCode.SelectedItem); 
    MessageBox.Show(prd.ProductID.ToString()); 
    } 

이 문제를 어떤 방법이 있나요? 대단히 감사합니다!

답변

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 이벤트를 잊어 버렸습니다.