Code wird ungewollt im Designer Modus ausgeführt

  • WPF MVVM

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Code wird ungewollt im Designer Modus ausgeführt

    Hey community :)

    Ich hab ein mittelgroßes Problem mit meinem Designer, also er führt ungewollt meinen Code aus (zumindest glaube ich dass er das tut...)

    Was an anderer Stelle vielleicht gewollt ist, um evtl. Daten auch im Designmodus anzuzeigen kann ich an dieser Stelle gar net brauchen.

    Und zwar eins der ersten Aufgaben, die mein Programm macht, ist zu prüfen, ob eine gewisse Datenbankdatei (ist nicht wirklich eine aber erfüllt diesen Zweck) vorhanden ist und wenn nicht, wird eine Messagebox angezeigt zur Info an den User und dann ein Folder Browser. Bisher hatte ich da die Winforms-Varianten, jetzt hab ich mir die Dialoge selbst gebastelt, aber ich bezweifle, dass es an den Dialogen an sich liegt.... Es wird nämlich beim Laden des Projekts, beim Starten des Programms und beim Beenden des Programms im Debugmodus jeweils meistens so zwei bis drei Mal kurioserweise die zwei Dialoge angezeigt. Wie oft diese dann angezeigt, das scheint mir rein zufällig zu sein. War auch schon an die 10 mal mit dem Ergebnis, dass dann irgendwann ein Ausnahmefehler auftrat...

    Jetzt gibt es im XAML-Editor die Möglichkeit, mit einem kleinen Button den Projektcode zu disable, das bringt mir aber auch keine Besserung, wobei ich dazu sagen muss:
    Der relevante Code ist in einer SucheViewModel. Also hab ich dementsprechend den Code der SucheView abgeschaltet, aber mein Verständnis sagt mir, dass die SucheView sowieso gar nichts von einem SucheViewModel weiss und das somit hinfällig ist...

    Weiss jemand vielleicht woran das liegen könnte und wie man das beheben kann?

    Ich will da net damit rumspielen wenn ich net genau weiss was ich da tu...
    Hi.

    Schaue mal ob deine Aufrufe (die deine Dialoge) auslösen.
    Irgendwie/-wann bei der Erzeugung deiner Objekte.

    Dazu zählen auch die XAML Dateien, zwar nicht so direkt aber ich hatte das immer wenn ich Objekte in Xaml angesprochen habe.

    Ansonsten im Codebehind die Loaded- und Activation- und wie sie alle hießen. Hans, Franz und Hannelore... :)

    Der Designer soll ja Realdaten anzeigen können, um die UI besser zu "Stylen".

    Schnellschuss aus der Hüfte und so, nö.. :D

    Apropo nutzt du das MVVM-Pattern?

    Zur SucheView: Ist dort ein Event für die Tastatur eingaben vorgesehen (TextBox) ?

    Wenn ja, prüfe bitte mal ob der "UpdateSourceTrigger = PropertyChanged" als Wert hat?

    c.u. @kafffee
    Naja, wenn du im Designer von z.b. einem UserControl einen Designtime Datenkontext angibst dann passiert nichts anderes (habe ich dir schon ein paar mal erklärt) das der parameterlose Konstruktor aufgerufen wird.
    Will man also Designtime-Daten erstellen muss das genau dort passieren. Um zu entscheiden welche Daten nun erstellt werden sollen, also die die man zur Designzeit erstellen will oder die die man zur Laufzeit erstellen will dann muss man eben prüfen ob man in der Designzeit ist.

    Du zeigst nicht wie du das im Moment machst. in meinen Basisklassen habe ich immer eine Eigenschaft "IsInDesigntime" über welche ich das abfragen kann.
    Machst du das?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Joshi
    Das was du mir schreibst hat glaube ich eher "mit ohne" MVVM zu tun:

    Joshi schrieb:

    Dazu zählen auch die XAML Dateien, zwar nicht so direkt aber ich hatte das immer wenn ich Objekte in Xaml angesprochen habe.


    Joshi schrieb:

    Zur SucheView: Ist dort ein Event für die Tastatur eingaben vorgesehen (TextBox) ?


    Nein.

    @ErfinderDesRades
    Ja klar die Prozedur wird von der Sub New() meines ViewModels aufgerufen. Würdest du das eher in die ApplicationStartup packen?

    @Nofear23m
    Ah ja, da kommen wir der Sache schon näher:
    Hab jetzt einfach als erste Line in den entsprechenden Prozeduren das hier gepackt:
    If IsInDesignMode = True Then Return

    Da weigert er sich dann natürlich, was im Designer anzuzeigen (s. Screenshot), aber das kann und muss ich dann wahrscheinlich in Kauf nehmen... Ist glaub ich nicht weiter schlimm.. jedenfalls besser als vorher...
    Bilder
    • screenshot 20220124-1.png

      31,83 kB, 739×423, 43 mal angesehen

    kafffee schrieb:

    aber das kann und muss ich dann wahrscheinlich in Kauf nehmen...

    Also, die Abfrage ob man im Designtime ist hat mal nix mit deinem Screenshot zu tun, und nochmal. Designtime Daten sind nicht die echten Daten.
    Ziel ist es ja Fake-Daten anzuzeigen damit man eben schön die View entwickeln kann. Anstatt ... Then Return kannste ja Daten zur Verfügung stellen.

    Das ist wirklich keine hohe Mathematik. Jemand der MVVM machen will sollte schon zumindest eine If Then Else Zeile hinbekommen. Sorry, aber echt.

    Wo genau du nun den Fehler hast warum die View nicht korrekt gerendert werden kann, kann ich dir so nicht sagen, aber wie immer. Code verstehen und verstehen was er macht ist hier abermals Sache.
    Sorry für die harten Worte.... Jetzt bin ich wieder lieb ;)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Alles okay ;)
    Die View ist eh schon fertig, da wurde mir eh nicht viel angezeigt, weil ich die Vordergrundfarbe für das komplette Fenster per Code und einer Dynamic Resource festgelegt hab. Ist schon Monate her, jetzt da ich weiss dass es das gibt bin ich nächstes Mal klüger und leg das Ganze so aus dass ich von Anfang an paar Fake Daten (und Farben :-)) zur Verfügung hab...
    Ich gehe davon aus, dass jetzt dieser Fehler daran liegt, dass die Prozeduren Teil der Sub New () sind. Vielleicht das Ganze in die ApplicationStartup? Oder wäre das nicht Mvvm-konform?
    Schon wieder willst du Workarounds schaffen anstatt den Fehler zu verstehen.
    Ich weis nicht genau was du da alles machst und kann so keine korrekte Antwort geben.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Okay alles klar. Werds schon hinbekommen...

    Edit:
    @Nofear23m
    Bin der Sache auf den Schlich gekommen, irgendwie kann er die bass.dll zur Designzeit nicht laden (Fehler 0x8007007E). Auch nicht wenn ich sie zusätzlich ins View Ausgabeverzeichnis kopiere. Ich glaube da ist echt kein Kraut dagegen gewachsen, VB.Net kennt ja nur den Wrapper bass.net.dll, der dann während der Laufzeit auf die bass.dll zugreift (diese kann man nicht über Verweise zufügen, man muss sie ins Ausgebeverzeichnis einfach nur reinkopieren....)

    Vielleicht frag ich da mal im Forum von Un4Seen Developments (also dem Entwickler) nach...

    Edit 2:
    So auch das hab ich hinbekommen... Einfach vor der Intitialisierung der bass.dll nochmal IsInDesignMode abgefragt...

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „kafffee“ ()

    Das ist ja auch nicht der Sinn und zweck des DesignTime Support.

    Der Designtime Support unter WPF soll dir Helfen beim Designen des Controls, nicht mehr und nicht weniger.

    Du darfst produktiven Code einfach nicht zur DesignTime initialisieren. Aus.

    Und wenn du es nicht verstehst oder die Zusammenhänge nicht auf die reihe bekommst das ist es am besten du nimmst den Designersupport einfach raus, damit verlierst du zwar Intellisense in XAML aber du kommst zumindest zurecht.

    Das ist auch der Grund warum ich auch nicht immer Designtime Support empfehle, man muss schon wissen was da passiert, initialisiert man im Konstruktor noch andere ViewModels dann wird ja dort auch der Konstruktor aufgerufen, usw.

    Also, schau nochmal nach und denke mal ne ordendliche Runde drüber nach was du da genau machst und was überhaupt nötig ist.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##