首页 > 解决方案 > 绑定更新后如何以编程方式选择`NavigationView`的绑定`NavigationViewItem`

问题描述

我的设置基本上如下:

什么有效

NavigationViewItem到达页面后会显示 s 。

问题

我需要设置一个指定NavigationViewItemSelectedItemNavigationView。但是没有NavigationViewItem(from viewModel) 可以使用 inside OnNavigatedTo(NavigationEventArgs e),因为那时viewModel.NavItems还没有准备好。

那么在这种异步情况下是否有选择 a 的模式?NavigationViewItem

XAML

<NavigationView x:Name="navView" 
                MenuItemsSource="{x:Bind viewModel.NavItems, Mode=OneWay}"
                SelectionChanged="NavView_SelectionChanged" >
…

视图模型

internal class MainPageViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        // The data service
        private MainDataService mainDataService = new MainDataService();

        private List<Book> books = new List<Book>();
        public List<Book> Books
        {
            get
            {
                return this.books;
            }
            set
            {
                this.books = value;
                this.OnPropertyChanged();
                this.OnPropertyChanged("NavItems");
            }
        }

        public IEnumerable<NavigationViewItemBase> NavItems
        {
            get
            {
                return Books.SelectMany(
                    b => (new List<NavigationViewItemBase> { new NavigationViewItemHeader {
                        Content = b.Title,
                        Tag = b.Title
                    } })
                    .Concat(
                        b.Sections.Select(s => new NavigationViewItem
                        {
                            Content = s.Title,
                            Icon = new FontIcon { Glyph = "\uE8B7", FontFamily = new FontFamily("Segoe MDL2 Assets") }
                        })
                    )
                );
            }
        }

        // @param selectedBookIndex: the index of the book whose first section
        // should be selected.
        public async Task UpdateBooks(int selectedBookIndex)
        {
            await mainDataService.PrepareData();
            this.Books = mainDataService.Books;
        }

        …
    }

标签: c#asynchronousdata-bindinguwpwindows-10

解决方案


那么在这种异步情况下是否有选择 NavigationViewItem 的模式?

对于异步情况,您需要使用ObservableCollection但不需要List. 它代表一个动态数据集合,在添加、删除项目或刷新整个列表时提供通知。

但是在 OnNavigatedTo(NavigationEventArgs e) 中没有可以使用的 NavigationViewItem(来自 viewModel),因为此时 viewModel.NavItems 还没有准备好。

在数据未准备好之前,您可以将Frame导航保留到用作NavigationViewLoaded 事件中的占位符的默认页面。有关更多信息,您可以深入参考数据绑定


推荐阅读