-1

我正在使用 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,但它也会抛出一个NullReferenceExceptionat _items.Remove(itemFromPayload)
即使我通过按钮手动刷新集合,结果也是一样的。
每个ItemsViewModel库只创建一次,即使在它们之间切换后也会抵抗,所以引用应该存在。

我在这里错过了什么?

4

1 回答 1

1

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

于 2017-04-18T13:20:48.363 回答