PropertyChanged事件中的NullReferenceException(Prism 6.3)

时间:2017-04-18 12:48:38

标签: c# wpf mvvm prism prism-6

我使用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只为每个库创建一次,即使在它们之间切换也会产生阻止,因此引用应该存在。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

AFAICT _items未初始化,除非您使用&#34;有效&#34;导航到它数据,异步加载。所以_items可能是&#34; null&#34;在页面显示之后(此时XAML可能会尝试使用null的集合)。相反,请考虑始终将其初始化为空集合,然后使用您想要显示的数据填充该集合(在正确的线程上)。这就是ObservableCollections的工作方式。

相关问题