我使用Prism 6.3构建一个带有seafile的简单云客户端
用户登录后,我导航到侧边区域的侧边栏(SidebarRegion)。 OnNavigatedTo
是加载并显示的库。
当所选库更改时,我导航到新的ItemsView实例(ContentRegion)并加载项目(从库中),以便它们也可以显示。
如果现在点击某个项目,我会导航到另一个区域以显示有关该项目的详细信息。
public SeafDirEntry SelectedItem
{
get { return _selectedItem; }
set
{
if (!SetProperty(ref _selectedItem, value) || value == null)
return;
var parameter = new NavigationParameters {{ "item", _selectedItem }};
_regionManager.RequestNavigate(_regionNames.InfoBarRegion, new Uri("ItemInfoView", UriKind.Relative), parameter);
}
}
还有一个删除按钮,该按钮挂钩到删除项目的命令
现在,在从服务器删除项目/文件后,我连接PubSubEvent
以使用RefreshItemsAsync()
方法从库中重新加载项目。
覆盖项目集合后,PropertyChanged
事件会抛出NullReferenceException
,即使我尝试这样做:
public ObservableCollection<SeafDirEntry> Items
{
get { return _items; }
set
{
if (value == _items)
return;
_items = value;
RaisePropertyChanged(); // <- throws here
// SetProperty(ref _items, value); <- same result
}
}
我还尝试将该项目中的项目作为PubSubEvent
的有效内容删除,但它也会在NullReferenceException
处抛出_items.Remove(itemFromPayload)
。
即使我通过按钮手动刷新集合,也会产生相同的结果
ItemsViewModel
只为每个库创建一次,即使在它们之间切换也会产生阻止,因此引用应该存在。
我错过了什么?
答案 0 :(得分:1)
AFAICT _items未初始化,除非您使用&#34;有效&#34;导航到它数据,异步加载。所以_items可能是&#34; null&#34;在页面显示之后(此时XAML可能会尝试使用null的集合)。相反,请考虑始终将其初始化为空集合,然后使用您想要显示的数据填充该集合(在正确的线程上)。这就是ObservableCollections的工作方式。