我正在尝试使用AutoCompleteBox
来自 WPF Toolkit 的搜索字段。AutoCompleteBox 的 Text 属性绑定到ViewModel
实现INotifyPropertyChanged
. 当属性更改时,它会获取新的建议以显示给用户。
如果用户在选择一个之前使用箭头键扫描自动完成建议列表,则会出现问题 - 光标移动到弹出窗口的那一刻,SelectionChanged
被触发,文本字段获得一个新值,并且自动完成建议被重新收集. 这也干扰了我使用该SelectionChanged
事件开始搜索的愿望。
有什么方法可以防止 SelectionChanged 事件在键盘导航上触发?
这就是我的设置方式。注意sc:SearchField
是它的一个子类AutoCompleteBox
,它只提供了一种访问TextBox
属性的方法,AutoCompleteBox
所以我可以调用类似的函数SelectAll()
XAML:
<sc:SearchField x:Name="SearchField" DataContext="{Binding SearchBoxVm}" Text="{Binding Query, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding QuerySuggestions, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsTextCompletionEnabled="False" Margin="54,10,117,67" Grid.RowSpan="2" BorderThickness="0" FontSize="14" PreviewKeyUp="searchField_OnKeyup" Foreground="{Binding Foreground, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontStyle="{Binding QueryFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
</sc:SearchField>
视图模型:
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");
}
}
搜索字段子类:
public class SearchField : AutoCompleteBox
{
public TextBox TextBox
{
get
{
return (this.GetTemplateChild("Text") as TextBox);
}
}
}