WPF Combobox lostFocus事件成为一个无限的lopp

问题描述:

请看我的代码, 这将成为一个无限循环,同时调用组合框的lostfocus事件 我需要从数据库中的一些数据和用户可以选择数据只有形式列表与打字选项。WPF Combobox lostFocus事件成为一个无限的lopp

mainwindow.xaml

<Grid> 
    <TextBox x:Name="txt1" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" Margin="112,10,0,0"/> 
    <ComboBox x:Name="cmb" GotFocus="cmbgotfocus" LostKeyboardFocus="cmblost" KeyDown="cmbkeydown" IsEditable="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="238" Margin="112,50,0,0" /> 
</Grid> 

private void cmbkeydown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Return || e.Key == Key.Escape) 
     { 
      cmb.IsDropDownOpen = false; 
     } 
     else 
     { 
      cmb.IsDropDownOpen = true; 
     } 
    } 

    private void cmblost(object sender, RoutedEventArgs e) 
    { 
     if (cmb.SelectedIndex < 0 && cmb.Text!="") 
     { 
      MessageBox.Show("Please select a valid data from list only", "Warning"); 
      cmb.Focus(); 
     } 
    } 
+0

你有没有试过看看调试工具会发生什么? –

+0

在lostfocus处理程序中调用cmb.Focus()可能不是一个好主意 – vkluge

如果我没有得到你,你想用户键入ComboBox一些文本,如果用户的条目不匹配任何项目,重点应保留在ComboBox中的TextBox

<ComboBox x:Name="Cmb1" IsEditable="True" 
      Control.PreviewLostKeyboardFocus="Control_PreviewLostKeyboardFocus" ...> 

处理代码:

private void Control_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
    { 
     if (!(e.OriginalSource is TextBox)) return; 

     TextBox tb = (TextBox)e.OriginalSource; 
     if (Cmb1.SelectedIndex < 0) 
     { 
      Cmb1.Text = ""; 
      e.Handled = true; 
     } 
    } 

请告诉我们,如果这能解决您的问题。