c# - 绑定更新后如何以编程方式选择`NavigationView`的绑定`NavigationViewItem`
问题描述
我的设置基本上如下:
NavigationView
的MenuItemsSource
必然viewModel.NavItems
。NavItems
是 的计算属性viewModel
。
视图模型类实现
INotifyPropertyChanged
绑定目的Books
视图模型是异步加载的。
什么有效
NavigationViewItem
到达页面后会显示 s 。
问题
我需要设置一个指定NavigationViewItem
为 SelectedItem
的NavigationView
。但是没有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;
}
…
}
解决方案
那么在这种异步情况下是否有选择 NavigationViewItem 的模式?
对于异步情况,您需要使用ObservableCollection
但不需要List
. 它代表一个动态数据集合,在添加、删除项目或刷新整个列表时提供通知。
但是在 OnNavigatedTo(NavigationEventArgs e) 中没有可以使用的 NavigationViewItem(来自 viewModel),因为此时 viewModel.NavItems 还没有准备好。
在数据未准备好之前,您可以将Frame
导航保留到用作NavigationView
Loaded 事件中的占位符的默认页面。有关更多信息,您可以深入参考数据绑定。
推荐阅读
- c# - 为什么授权属性无法授权有效用户登录的操作?
- python - 导致龙卷风 ioloop 在停止时停止的可能原因是什么?
- apache-spark - 如何使用火花进行并行操作
- java - Mockito doReturn:对重载定义的模糊引用
- javascript - React redux 表单测试失败
- ios - 如何将放置行从一个部分拖放到另一个 UITableView 部分
- javascript - 角度日期选择器的问题
- sql - PostgreSQL - 从 2 列中选择具有复合最大值的行
- hybris - 无法解析属性“startingPage”的值“主页”(hybris)
- javascript - 使用谷歌地图获取纬度和经度