2013-04-17 67 views
1

我有一個AutoCompleteBox,我使用ProductCode進行搜索。自動完成框的項目源是一個列表List<Product>,其中產品具有以下屬性:ProductCode,ProductID,ProductBrandCode。c#WPF AutoCompleteBox - 列表中返回第一個匹配項的simillar命名項

這一切工作正常,除非當我嘗試檢索SelectedItem屬性時,選定的產品具有與列表中的其他產品相同的ProductCode。

因此,例如,可以說我有6種產品:

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

如果我選擇了5號產品(5號),在返回的SelectedItem與ID產品= 3。同樣的事情發生,如果我選擇產品id = 4,我總是得到與ProductCode相匹配的第一個產品。我假設這是由於我的ValueMemberPath設置爲ProductCode witch這一事實造成的,在這種情況下,它並不是唯一的,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

我有同樣的問題。問題是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事件重置。

相關問題