Laden...

[Erledigt] Der objektverweis wurde nicht auf eine objektinstanz festgelegt

Erstellt von SteffoD vor 5 Jahren Letzter Beitrag vor 5 Jahren 13.295 Views
S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren
[Erledigt] Der objektverweis wurde nicht auf eine objektinstanz festgelegt

Hi,
ich habe ein Control den ich in XAML deklariere:

<designerControls:DesignerControl x:Name="DesignerControlElement"/>

In der entsprechenden Klasse wird dieses Control als Parameter übergeben:

public CassetteControl()
{
	InitializeComponent();
	Loaded += OnWindowLoaded;
	DataContext = this;
}

private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
	if (init)
	{
		FindCassetteController.Instance.Subscribe(new BaseImageMessageObserver(DesignerControlElement));
		init = false;
	}
}

Der BaseImageMessageObserver manipuliert dann zu einem späteren Zeitpunkt bei einem Netzwerk-Event den übergebenen DesignerControlElement.

Hier einige Fakten:* CassetteControl befindet sich in einem Tab, der standardmäßig nicht ausgewählt ist

  • OnWindowLoaded() von CassetteControl wird immer ausgeführt, auch wenn der Tab nie ausgewählt wurde.
  • Wenn ich den CassetteControl-Tab vorher auswähle und dann wieder zu einem anderem Tab wechsele und der Netzwerk-Event tritt auf, dann klappt alles.
  • Wenn ich den CassetteControl-Tab vorher nicht ausgewählt habe, wird zwar OnWindowLoaded() ausgeführt, aber sobald der Netzwerk-Event kommt, erhalte ich folgende Fehlermeldung: "Der objektverweis wurde nicht auf eine objektinstanz festgelegt"

Weiß jemand weiter? Ich danke im Voraus! 🙂

L. G.,
Steffo

16.842 Beiträge seit 2008
vor 5 Jahren

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Alles - auch in WPF - super einfach und eigenständig mit dem Debugger zu lösen.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Wenn Du ermittelt hast, was Null ist, kannst Du zur Lösungsfindung übergehen.

Warum ein Netzwerk-Event direkt in die UI geht; das ist mir ein wenig ein Rätsel.
[Artikel] Drei-Schichten-Architektur

S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren

@The69

public static FindCassetteController Instance { get; } = new FindCassetteController();

@Abt
Zu 1: Danke, ich weiß was null ist.
Zu 2: Auch dies ist mir bekannt.
Zu 3: Auch MVC und Co. sind mir bekannt. Es wird ein Bild in die GUI geladen und das Bild muss irgendwie rein kommen. Der Netzwerk-Code ist natürlich nicht direkt in der GUI, stattdessen gelangt das Bild mittels Observer-Pattern in die GUI.

@all: Es scheint, dass ein Property von DesignerControlElement erst bei der Anzeige per lazy evaluation geladen wird. Das muss ich mir mal genauer anschauen...

5.658 Beiträge seit 2006
vor 5 Jahren

Hi SteffoD,

ja, die Controls werden automatisch gerneriert und wieder aus der Oberfläche entfernt. Daher kannst du nicht davon ausgehen, daß alle Instanzen von Anfang an vorhanden sind, oder die gleiche Instanz später immernoch vorhanden ist usw.

Warum lagerst du diese Logik nicht ins ViewModel aus? Dort hast du die volle Kontrolle über alles, und kannst Web-Requests abschicken und auf Antworten reagieren.

Die Controls sollten jedenfalls NUR für die Anzeige zuständig, und die Logik der Anwendung in der BL und die Logik der Benutzeroberfläche im ViewModel zu finden sein.

[Artikel] Drei-Schichten-Architektur
[Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren

Hi MrSparkle,

danke, ich habe mich erst mal eines Workarounds beholfen. Mit MVVM habe ich zwar schon gearbeitet, aber mir wäre erst mal nicht auf Anhieb klar, wie ich das in diesem Fall umsetzen sollte. Dazu bin ich noch nicht Profi genug, zumal ich ständig zwischen C++, Qt, Bildverarbeitung und C#/WPF hin und her springe und mir das ein tiefes Einarbeiten in WPF kaum möglich macht.
Ich werde auf jeden Fall im Hinterkopf behalten öfters ViewModels zu verwenden, wo mir das möglich erscheint. - An einigen Stellen mache ich das wie gesagt schon.