2017-04-18 2 views
-1

Ich benutze Prism 6.3, um einen einfachen Cloud-Client mit Seafile zu erstellen.
Nachdem sich der Benutzer angemeldet hat, navigiere ich zu einer Seitenleiste in einer Seitenregion (SidebarRegion). OnNavigatedTo sind die Bibliotheken, die in einer Sammlung geladen und angezeigt werden.NullReferenceException bei PropertyChanged Ereignis (Prism 6.3)

Wenn sich die ausgewählte Bibliothek ändert, navigiere ich zu einer neuen ItemsView-Instanz (ContentRegion) und lade die Elemente (aus der Bibliothek), damit sie ebenfalls angezeigt werden können.

Wenn ich jetzt auf ein Element klicke, navigiere ich zu einer anderen Seitenregion, um detaillierte Informationen über das Objekt anzuzeigen.

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); 
    } 
} 

Es gibt auch eine Löschtaste, die auf einen Befehl angeschlossen ist, die das Element löscht

Jetzt, nachdem das Element/Datei vom Server gelöscht wird, hakte ich die PubSubEvent bis die Elemente neu zu laden aus die Bibliothek mit der RefreshItemsAsync() Methode. Nachdem die Elemente Sammlung überschrieben wird, das PropertyChanged Ereignis wirft ein NullReferenceException, auch wenn ich versuche, dies:

public ObservableCollection<SeafDirEntry> Items 
{ 
    get { return _items; } 
    set 
    { 
     if (value == _items) 
      return; 

     _items = value; 
     RaisePropertyChanged(); // <- throws here 
     // SetProperty(ref _items, value); <- same result 
    } 
} 

Ich habe auch versucht, das Element aus der Sammlung mit dem Elemente als Nutzlast der PubSubEvent zu entfernen, aber es auch wirft einen NullReferenceException um _items.Remove(itemFromPayload).
Auch wenn ich die Sammlung manuell mit einer Schaltfläche aktualisieren, das gleiche Ergebnis.
Die ItemsViewModel wird nur einmal pro Bibliothek erstellt und widersteht selbst nach dem Wechsel zwischen ihnen, so dass die Referenz vorhanden sein sollte.

Was habe ich hier verpasst?

+0

Mögliche Duplikate von [Was ist eine NullReferenceException, und wie behebe ich es?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix -it) – Rafael

+0

@SvenLion Wirklich, hast du meine ganze Erklärung gelesen? Ich weiß, wo die Ausnahme ist, aber ich weiß nicht, wo die Referenz verloren geht. Ich kenne auch den verlinkten Beitrag, aber es wird nicht viel helfen, diesen wpf-spezifischen Fehler und eine Lösung dafür zu finden. –

+2

Es ist kein wpf-spezifischer Fehler, weil eine NullReferenceException immer ein Problem ist, wenn etwas auf null gesetzt wird/nicht initialisiert wird. – Rafael

Antwort

1

AFAICT _items wird nicht initialisiert, es sei denn, Sie navigieren mit "gültigen" Daten, die asynchron geladen werden. So könnten _items gut "Null" sein, nachdem die Seite angezeigt wurde (zu diesem Zeitpunkt würde der XAML vermutlich versuchen, eine Sammlung zu verwenden, die null ist). Betrachten Sie stattdessen den Ansatz, es immer mit einer leeren Sammlung zu initialisieren und dann diese Sammlung (im richtigen Thread) mit den Daten zu füllen, die Sie anzeigen möchten. So sollen ObservableCollections arbeiten.

Verwandte Themen