Wpf 如何防止自动完成框中的键盘导航触发SelectionChanged事件?

Wpf 如何防止自动完成框中的键盘导航触发SelectionChanged事件?,wpf,xaml,autocomplete,wpftoolkit,selectionchanged,Wpf,Xaml,Autocomplete,Wpftoolkit,Selectionchanged,我正试图使用WPF工具包中的AutoCompleteBox构建一个搜索字段。AutoCompleteBox的文本属性绑定到ViewModel中的一个属性,该属性实现了INotifyPropertyChanged。当属性更改时,它会获取新的建议以显示给用户 如果用户在选择自动完成建议之前使用箭头键扫描自动完成建议列表,则会出现问题-光标移动到弹出窗口时,SelectionChanged被触发,文本字段获得新值,自动完成建议被重新收集。这也妨碍了我使用SelectionChanged事件启动搜索的愿

我正试图使用WPF工具包中的
AutoCompleteBox
构建一个搜索字段。AutoCompleteBox的文本属性绑定到
ViewModel
中的一个属性,该属性实现了
INotifyPropertyChanged
。当属性更改时,它会获取新的建议以显示给用户

如果用户在选择自动完成建议之前使用箭头键扫描自动完成建议列表,则会出现问题-光标移动到弹出窗口时,
SelectionChanged
被触发,文本字段获得新值,自动完成建议被重新收集。这也妨碍了我使用
SelectionChanged
事件启动搜索的愿望

有没有办法防止键盘导航触发SelectionChanged事件

我是这样安排的。注意
sc:SearchField
AutoCompleteBox
的一个子类,它只提供访问
AutoCompleteBox
上的
TextBox
属性的方法,因此我可以调用
SelectAll()

XAML:


不确定这是否是您想要做的,但我有以下代码,它仅在按下“回车”键或使用鼠标从列表中选择项目(单击鼠标左键)时更改选择。我可以向上和向下箭头显示列表而不会出现问题,并且只有当用户按enter键或单击所需的条目时,才会触发selection changed事件

请注意,我使用的是自动完成框,而不是您使用的搜索字段

在XAML中:

<toolkit:AutoCompleteBox Name="OmniSearchTextBox"
                         ItemsSource="{Binding CompanyList}" 
                         SelectedItem="{Binding SelectedObject, Mode=TwoWay}"
                         IsTextCompletionEnabled="False" 
                         FilterMode="Contains" 
                         KeyUp="OmniSearch_KeyUp"
                         MouseLeftButtonUp="OmniSearch_MouseLeftButtonUp"
                         Margin="10,94,10,0" 
                         RenderTransformOrigin="0.518,1.92" Height="35"
                         VerticalAlignment="Top" />
在ViewModel中:

void GetQuerySuggestions()
{
    if (!string.IsNullOrEmpty(Query) && !Query.Equals(DEFAULT_TEXT))
    {
        QueryFont = FontStyles.Normal;
        Foreground = Brushes.Black;
        QuerySuggestions = SearchAssistant.GetQueryRecommendations(_query);
    }
}

public string _query = DEFAULT_TEXT;
public string Query
{
    get
    {
        return _query;
    }
    set
    {
        _query = value;
        GetQuerySuggestions();
        NotifyPropertyChanged("Query");
    }
}

List<string> querySuggestions = new List<string>();
public List<string> QuerySuggestions
{
    get { return querySuggestions; }
    set
    {
        querySuggestions = value;
        NotifyPropertyChanged("QuerySuggestions");
    }
}
private const string CompanyListPropertyName = "CompanyList";
private ObservableCollection<Company> _companyList;
public ObservableCollection<Company> CompanyList
{
    get
    {
        return _companyList;
    }
    set
    {
        if (_companyList == value)
        {
            return;
        }

        _companyList = value;
        RaisePropertyChanged(CompanyListPropertyName);
    }

}

private Company _selectedObject;
public Company SelectedObject
{
    get
    {
        return _selectedObject;
    }
    set
    {
        if (_selectedObject != value)
        {
            _selectedObject = value;
        }
    }
}
私有常量字符串CompanyListPropertyName=“CompanyList”; 私人可观察收集公司列表; 公开收集公司名单 { 得到 { 返回公司列表; } 设置 { if(_companyList==值) { 返回; } _公司列表=价值; RaisePropertyChanged(CompanyListPropertyName); } } 私人公司(u选择的对象);; 上市公司选定对象 { 得到 { 返回_selectedObject; } 设置 { 如果(_selectedObject!=值) { _selectedObject=值; } } }
<toolkit:AutoCompleteBox Name="OmniSearchTextBox"
                         ItemsSource="{Binding CompanyList}" 
                         SelectedItem="{Binding SelectedObject, Mode=TwoWay}"
                         IsTextCompletionEnabled="False" 
                         FilterMode="Contains" 
                         KeyUp="OmniSearch_KeyUp"
                         MouseLeftButtonUp="OmniSearch_MouseLeftButtonUp"
                         Margin="10,94,10,0" 
                         RenderTransformOrigin="0.518,1.92" Height="35"
                         VerticalAlignment="Top" />
private void OmniSearch_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        BindingExpression exp = this.OmniSearchTextBox.GetBindingExpression(AutoCompleteBox.SelectedItemProperty);
        exp.UpdateSource();
    }
}

private void OmniSearch_MouseLeftButtonUp(object sender, MouseEventArgs e)
{
    BindingExpression exp = this.OmniSearchTextBox.GetBindingExpression(AutoCompleteBox.SelectedItemProperty);
    exp.UpdateSource();
}
private const string CompanyListPropertyName = "CompanyList";
private ObservableCollection<Company> _companyList;
public ObservableCollection<Company> CompanyList
{
    get
    {
        return _companyList;
    }
    set
    {
        if (_companyList == value)
        {
            return;
        }

        _companyList = value;
        RaisePropertyChanged(CompanyListPropertyName);
    }

}

private Company _selectedObject;
public Company SelectedObject
{
    get
    {
        return _selectedObject;
    }
    set
    {
        if (_selectedObject != value)
        {
            _selectedObject = value;
        }
    }
}