WPF Einarbeitung, Anwendung starten, Anwendung vorbereiten (.NET 7)

  • WPF
  • .NET 7–8

Es gibt 64 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Amro schrieb:

    Bitte verbreite keinen solchen Unsinn. Spätestens wenn du einen DI-Container verwendest und Dependency Injection einsetzt, wirst du es nicht in XAML definieren können, da XAML nur den Basiskonstruktor verwenden kann.
    hmm - Unsinn würde ich das deswegen nicht nennen.
    Klingt für mich eher nach einem starken Argument gegen Dependency Injection.
    Aber ich müsste es mal probieren. Durchaus möglich, dass ich einen Weg finden würde, mir Designtime-Unterstützung trotz DI zu erhalten.
    (Sachma frustriert euch das nicht als Entwickler, dass das neueste und dollste eigentlich einen riesigen Rückschritt der Programmiersprache bedeutet? Was war nochmal vor Designtime-Unterstützung - GW-Basic, oder?)

    ErfinderDesRades schrieb:

    (Sachma frustriert euch das nicht als Entwickler, dass das neueste und dollste eigentlich einen riesigen Rückschritt der Programmiersprache bedeutet? Was war nochmal vor Designtime-Unterstützung - GW-Basic, oder?)
    Da kann ich wohl nicht ganz folgen.

    Ich habe jetz nochmal mit etwas mehr Verständnis für Xaml auf dein PersonList geschaut, da habe ich noch ein paar Fehlermeldungen, die mich ablenken und ich nicht beheben kann.

    Soll ich die ignorieren? Die Anwendung startet.

    Wird das Mainmodel mit dieser StaticRessoure Anweisung instanziert?
    Du bindest an eine statische Ressource. WPF versucht zur Desingzeit diese Ressource zu finden, obwohl sie nicht vorhanden ist. Du musst WPF die Möglichkeit geben, zur Designtime ein Objekt aus dem MainModel zu erstellen, indem es den parameterlosen Konstruktor aufruft.
    Zur Laufzeit ist das Objekt irgenwie doch vorhanden und Wpf findet es. Keine Ahnung wie aber es scheint zu funktionieren.

    Probier mal das hier:


    XML-Quellcode

    1. xmlns:local="clr-namespace:WPf1"
    2. Height="350" Width="525">
    3. <Window.DataContext>
    4. <local:MainModel />
    5. </Window.DataContext>


    achte darauf das MainModel im Namespace locla: vorhanden ist.
    Das sollte dein Problem beheben.
    <local:MainModel /> ist glaub keine gute Idee, weil das instanziert ein Mainmodel .
    weil wenn jedes View sich sein eigenes Mainmodel instanziert hat man viele Mainviewmodelse und Chaos.

    Haudruferzappeltnoch schrieb:

    Wird das Mainmodel mit dieser StaticRessoure Anweisung instanziert?
    Ich denke, das MainModel ist in den Resourcen von App.Xaml angelegt.
    Dort ist es instanziert, und daran kann alle View binden - ohne dass Dubletten entstehen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Zum Verständnis , MainModel ist das Objekt, das die Daten bereithält,stimmts?
    Nennen wir es MainViewModel.
    Das Anlegen von Datenobjekten als statische Ressourcen ist für mich neu. Statische oder Dynamische Ressourcen werden normalerweise für Dinge wie Bilder, Schriften und ähnliches verwendet. Deshalb sind das Ressourcen denke ich :).
    Klassen mit Eigenschaften und/oder Methoden gehören meiner Meinung nach nicht dazu, da statische Ressourcen anders geladen werden.
    Kann mir nicht vorstellen dass es funktioniert, aber anscheinend funktioniert es zur Laufzeit in WPF auf irgendeine Weise.

    WPF lädt Daten zur Laufzeit auch anders als zur Designtime, weshalb es gelegentlich Probleme gibt, zum Beispiel bei Bildern, bei denen man d:ImageSource oder so verwendet.
    DataContext ist normalerweise das, was für das Binding verwendet wird. Es gibt auch DataTemplates in der App.xaml, wo festgelegt wird, welches ViewModel als DataContext verwendet wird, wenn eine bestimmte Ansicht aufgerufen wird.

    ErfinderDesRades schrieb:

    Dort ist es instanziert, und daran kann alle View binden - ohne dass Dubletten entstehen.


    Das ist schon viel zuweit vorgegriffen , da gibt es Ansetzte wie den Di Container mit Register as Singleton oder Transient.
    Du kannst auch beim schliesen der View das Viewmodel Disposen oder das Datacontext lösen oder sonst irgenwie wenn du meinst zu zu viele instanzen entstehen. Wobei ich glaube das WPF sich auch im hintergrund um sowas kümmert. Keine Ahnung bin auch nur Anfänger. Müsste man irgenwie messen.
    Am Anfang würde ich mir kein Kopf machen. Das kommt schon früh genug.
    Weil es erstmal darum geht zu verstehen wie WPF im allgemeinen funktioniert.
    MVVM hat null mit WPF zu tun. Hier geht es nur darum wie du dein Projekt Strukturierts.
    Ja basierend auf Model , View und ViewModel aber jedes Projekt kann anders aussehen.
    Der Spielraum ist offen und es gibt nicht die eine Lösung. Musste ich auch nach langer Zeit erst lernen.
    Wäre ja auch schlimm wenn das so wäre.
    WPF lernen ist ein Thema , MVVM ist ein anderes Thema. Du kannst WPF nicht Strukturieren nach MVVM wenn du nicht mal
    die Basics der Datenbindung vertstanden hast. Deshalb ist es wichtig WPF zu verstehen , ein Projekt mit Codebehind oder Klassen erstellen das ist egal. Wenn das sitzt , dann erst versuchen nach MVVM zu Strukturieren. Wie gesagt meine Meinung und meine Erfahrung.

    Auf jedenfall finde ich das mit der Statischen Resource nicht Richtig.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amro“ ()

    ErfinderDesRades schrieb:

    Dort ist es instanziert, und daran kann alle View binden
    Jepp - das ist auf die BeispielSolution von mir gemünzt, die Hdz am Wickel hat.

    Wie gesagt: vom Main(View)Model darfs nur eines geben, und eine Lösung ist, es in App.xaml (VB: Appliccation.Xaml) in die Resourcen zu legen.

    Ist der Fehler aus post #22 denn nu weg?
    Ne, die Fehler sind noch da. Ich weiß nicht ob mir da was fehlt. Das scheint mit Definitionskontext zutun zu haben.
    MainModel heißt ja die Klasse Mainmodel steht da,
    (ich habe aber auch versucht MainModel hinzuschreiben, das verändert den Fehler von Nicht Gefunden zu Nicht Auflösbar),
    wenn ich tippe schlägt Intellisense auch Mainmodel vor.

    Dann eigentlich derselbe Fehler bei my:uclPerson, my ist ja der Namespace, dieser steht oben auch definiert ohne Kritik.

    Und bei Binding Persons/ meckert der über den /, wo ich syntaktisch aber nicht weiß was der bedeutet. Den wegmachen scheint da zu funktionieren.
    Aber wie gesagt, ich weiß nicht ob die Fehler schlimm sind oder nicht. Wenn man sich da nicht vertut, soll er halt meckern.
    So, jetzt habich das Tut selbst nochmal downgeloaded, geöffnet, kompiliert, und dann ins MainView.Xaml geguckt: alles paletti.

    Also weiss ich nicht das problem ;(

    Und nix wegmachen der / hat eine wichtige Funktion: Dadurch wird an das aktuelle Item einer CollectionView gebunden, und nicht an die ganze Liste.
    Ich habe jetz mein Studio nochmal geupdatet auf den neuesten Stand 17.7.5
    Ich habe nochmal neu die PersonListCs und die PersonList gedownloadet. Abgesehen davon, dass diese erstmal unterschiedlichen Xaml-Code aufweisen, sagen beide Versionen, sie können Mainmodel nicht finden, schlagen es dennoch in Intellisense vor. Die Fehler sind bei mir erst aufgetaucht nachdem ich die Anwendung auch einmal gestartet hatte.
    Und es hat sich ein weiterer Fehler dazu gesellt. You only can instantiate MainModel when MainModel.Instance.IsNull or MainModel.Instance.IsProvisional
    Wo kann ich denn IsProvisional setzen für den Designer?
    Sollte man im Designer schon die ucls sehen können? Denn bei mir tauchen die Buttons usw. erst bei laufender Anwendung auf.

    Haudruferzappeltnoch schrieb:

    You only can instantiate MainModel when MainModel.Instance.IsNull or MainModel.Instance.IsProvisional
    Dassis doch ein nützlicher Hinweis - den habich programmiert.
    Offensichtlich wird dein Mainmodel mehrfach instanziert, for whatever reasons.
    Was ja wie gesagt nicht gut ist.
    Habe nun einen möglichen Fehler-Grund: Ersetze mal die Public Shared Function IsInDesignMode() As Boolean durch folgende Version:

    VB.NET-Quellcode

    1. Private Shared _IsInDesignMode As Boolean? = Nothing
    2. Public Shared Function IsInDesignMode() As Boolean
    3. If Not _IsInDesignMode.HasValue Then
    4. _IsInDesignMode = DesignerProperties.GetIsInDesignMode(New Windows.DependencyObject)
    5. End If
    6. Return _IsInDesignMode.Value
    7. End Function
    Und dann bereinigen, rekompilieren, VS schliessen und wieder öffnen.

    Das dämliche ist, zur Designzeit muss bei diesem Ansatz das Mainmodel mehrfach instanzierbar sein - aber zur Laufzeit nicht.
    Also muss man sich eine Public Shared Function IsInDesignMode() As Boolean programmieren.
    Die vorherige Variante funzt auch bei WinForms - wo ich das halt auch brauche.
    Nur failt das, wenn es MS gefällt den VS-HostProzess mal wieder einen anderen Namen zu geben.
    Die neue Variante ist dagegen gefeit, allerdings ist sie auf Wpf beschränkt.
    ja genau.
    Und mit Process.GetCurrentProcess().ProcessName wird der abgerufen, und ist zur Designzeit ein anderer als zur Laufzeit.

    Nachgucken kann man die VS-Prozesse im Taskmanager.

    Kannste mir den deinigen mitteilen?
    bislang lautet meine Sammlung ja:

    VB.NET-Quellcode

    1. Private Shared _HostProcesses As New List(Of String)({"XDesProc", "denev"})

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Eine kurze Zwischenfrage außerhalb des Themas.
    Du hast z.B. deine MainModelBase in den Helpers in einem Namespace System.ComponentModel
    Im Objektexplorer sieht das so aus:

    Wenn ich einen Namespace um eine Klasse packe, dann sieht das immer so aus:


    Also der Namespace des Projekts ist immer noch extra umzu.
    Wie kommt das?
    ich hab im helpers-projekt den rootnamespace gelöscht.
    aber das ist eine heikle sache, heut würdich solch nicht tun.
    man kann nämlich den namespace auch so definieren

    Visual Basic-Quellcode

    1. Namespace Global.System.ComponenModel
    aber sparsam mit umgehen - dass man die MS-Namespaces nicht zu sehr vollmüllt mit eigenem Kram.
    Manche Programmierer lehnen das auch insgesamt ab, und sagen: willst du eigene Infrastruktur einbinden, sollste den Import gefälligst auch drüber schreiben.