UWP中NavigationView与AutoSuggestBox无法匹配NavigationViewItem问题
常见问题点及修复方案
1. 未正确筛选NavigationView的有效菜单项
NavigationView的MainMenuItems集合可能包含分隔符(NavigationViewItemSeparator)等非菜单项元素,需先筛选出NavigationViewItem类型的项:
var allMenuItems = NavView.MainMenuItems.OfType<NavigationViewItem>().ToList();
2. Content属性类型判断或取值错误
- 如果
Content直接绑定字符串:需判断不为null,并使用不区分大小写的匹配逻辑 - 如果
Content绑定自定义对象:需访问对象的具体属性(如标题属性)而非直接使用ToString()
示例字符串类型Content的过滤逻辑:
var filteredItems = allMenuItems.Where(item => item.Content is string content && !string.IsNullOrEmpty(SearchBox.Text) && content.IndexOf(SearchBox.Text, StringComparison.OrdinalIgnoreCase) != -1 ).ToList();
示例自定义对象(如MenuModel)的过滤逻辑:
// 假设自定义菜单模型 public class MenuModel { public string Title { get; set; } } // 过滤代码 var filteredItems = allMenuItems.Where(item => item.Content is MenuModel model && !string.IsNullOrEmpty(SearchBox.Text) && model.Title.IndexOf(SearchBox.Text, StringComparison.OrdinalIgnoreCase) != -1 ).ToList();
3. 未正确更新AutoSuggestBox的SuggestionsSource
在TextChanged事件中,需将过滤后的集合赋值给AutoSuggestBox.SuggestionsSource,同时注意仅在用户输入时执行过滤:
private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) { if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { var allItems = NavView.MainMenuItems.OfType<NavigationViewItem>().ToList(); var filteredItems = allItems.Where(item => item.Content is string content && content.IndexOf(sender.Text, StringComparison.OrdinalIgnoreCase) != -1 ).ToList(); sender.SuggestionsSource = filteredItems; } }
4. XAML配置错误
确保AutoSuggestBox的DisplayMemberPath与Content类型匹配:
- 若Content是字符串:可设置
DisplayMemberPath="Content" - 若Content是自定义对象:设置为对象的标题属性名,如
DisplayMemberPath="Title"
示例XAML:
<AutoSuggestBox x:Name="SearchBox" PlaceholderText="搜索菜单" TextChanged="AutoSuggestBox_TextChanged" DisplayMemberPath="Content"/>
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

