WPF-Projekt [LRPC]

  • WPF

Es gibt 111 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Ich hab mir jetzt gerade mal die ViewModels aus der WPF notes angeguckt, ich muss aber zugeben, das ich 90% davon nicht verstehe, ich würde bisher gerade so die ObserVableCollections hinbekommen, der rest scheint mir aktuel sehr "Bahnhof"
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo,

    das Grundgerüst besteht auch aus nicht viel mehr.
    Commands und so kann man auch noch später machen (erklären wir dir dann auch).

    Mach am besten erst mal das Grundgerüst, soweit wie du kommst und dann zeigst du es uns.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    naja, gut dabei kommt augenscheinlich nicht viel bei rum

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Imports LRPC.Model
    3. Public Class ProductListViewModel
    4. Inherits Infrastructure.ViewModelBase
    5. Private _availableproducts As ObservableCollection(Of Product)
    6. Public Property AvailableProducts As ObservableCollection(Of Product)
    7. Get
    8. Return _availableproducts
    9. End Get
    10. Set(ByVal value As ObservableCollection(Of Product))
    11. _availableproducts = value
    12. RaisePropertyChanged()
    13. End Set
    14. End Property
    15. Private _selectedproduct As Product
    16. Public Property SelectedProduct As Product
    17. Get
    18. Return _selectedproduct
    19. End Get
    20. Set(value As Product)
    21. _selectedproduct = value
    22. RaisePropertyChanged()
    23. End Set
    24. End Property
    25. End Class
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo,

    vom Prinzip her stimmt die Klasse ja schon mal.
    - Edit: Ein Konstruktor vo du eine Liste mit allen Produkten übergibst und ein Element schon in das SelectedProduct Property schreibst fehlt nur noch. Versuche das nochmal
    Allerdings brauchst du auch ein ViewModel für Product.
    Dann sieht deine jetzige Klasse so aus;

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Imports LRPC.Model
    3. Public Class ProductListViewModel
    4. Inherits Infrastructure.ViewModelBase
    5. Private _availableproducts As ObservableCollection(Of ProductViewModel)
    6. Public Property AvailableProducts As ObservableCollection(Of ProductViewModel)
    7. Get
    8. Return _availableproducts
    9. End Get
    10. Set(ByVal value As ObservableCollection(Of Product))
    11. _availableproducts = value
    12. RaisePropertyChanged()
    13. End Set
    14. End Property
    15. Private _selectedproduct As ProductViewModel
    16. Public Property SelectedProduct As ProductViewModel
    17. Get
    18. Return _selectedproduct
    19. End Get
    20. Set(value As Product)
    21. _selectedproduct = value
    22. RaisePropertyChanged()
    23. End Set
    24. End Property
    25. End Class


    Die Klasse ProductViewModel enthält einfach alle PRoperties von Product, halt mit PropertyChanged()

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Hm, es tut mir wirklich außerordentlich leid, aber das ganze ist dermaßen abstrakt, das es vermutlich für alle beteiligten sinnvoller wäre wenn ich hier schlicht und ergreifend aufgebe, wenn ich mir diese ViewModels angucke und wie die alle ineinadner greifen usw. kann ich absolut aufrichtig sagen, das ich das NIE begreifen werde....

    Bevor ihr hier jetzt noch mehr Zeit investiert, nur damit ich am Ende keinen deut weiter bin als vorher, da ist eure Zeit einfach zu schade für...

    Ich danke euch wirklich über die Maßen für den Versuch, aber auf diese Art und weise macht Programmieren für mich weder Spaß, noch Sinn. Es entsteht augenscheinlich nur ein wirrwarr aus ineineander verschachteltem Code. Wenn ich sehe und langsam begreife welch abnormer Aufwand für ein Simples Programm von nöten ist, bleibe ich wohl doch auf ewig bei Spagethicode, der ist linear und begreifbar. Ich empfinde es durchaus als sehr schade, da Templates für ListBoxen durchaus eine geniale Sache sind, aber ich wollte die WPF lernen, weil binding, Code sparen sollte, das hier benötigt deutlich mehr Code als einfach manuel zu sagen welche Liste was wie und wann laden soll.........
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo,

    kleine Zwischenfrage von mir, notfalls einfach bitte löschen :)

    Warum wird auch hier in den ViewModels INotifyPropertyChanged verwendet? Ich denke, das ist nur dazu da, um der WPF zu sagen, dass es neue Daten in den MODEL-Klassen gibt und diese neu anzeigen soll. Wo ist also der Sinn in einem ViewModel? :)

    KingLM97 schrieb:

    Warum wird auch hier in den ViewModels INotifyPropertyChanged verwendet? Ich denke, das ist nur dazu da, um der WPF zu sagen, dass es neue Daten in den MODEL-Klassen gibt und diese neu anzeigen soll. Wo ist also der Sinn in einem ViewModel?

    Hast du meine Tutorialreihe durch? Da ist es gut beschrieben. INotifyPropertyChanged ist eine Schnittstelle welche die BasisKlasse implementiert.

    Wenn du im Setter eines Properties NotifyPropertyChanged wirfst was wir mit der Methode RaisePropertyChanged() dann wird nur DIESES Property neu abgerufen.
    Die View wird NICHT darüber Benachrichtig das sich ein Model geändert hat. Sondern nur eine Eigenschaft des ViewModel auf welches die View gebunden ist.

    Das die View vom ViewModel entkoppelt ist weis sie das ja nicht von selbst.

    @asusdk gut. Lassen wir das, solange du die Basics der Sprache nicht drauf kannst hat das keinen Sinn, wenn du hier schon aufgibst brauchen wir da nichts mehr weiter machen. Weder verstehst du denn Sinn dahinter noch siehst du die Vorteile. Lassen wir das und brechen hier ab. Das Git Repository werde ich morgen löschen. Schafe um die Zeit, aber versucht haben wir es. Wer nicht will der hat schon.

    Werde ich mir das nächste mal aber besser überlegen.

    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. ##

    @asusdk warum gibst Du so schnell auf? Es lief doch ganz gut bisher.
    In der WPF ist es ja auch nicht wirklich neu, das Trennen von Daten und GUI, wird hier im Forum ja immer gepredigt, und die WPF setzt es halt konsequent um.
    Ich versuchs noch mal mit meinem Laienhaften Wissen zu erklären.
    Model ansich ist eigentlich stumpf der Datencontainer, wie deine Daten aussehen und welche Daten du benötigst. Die Oberfläche (View) weis nix von den Daten, und die Daten wissen nix von der View.
    Die Schicht dazwischen sind halt die ViewModel, hier wird alles abgebildet, was und wie die Daten in der Oberfläche angezeigt und verarbeitet werden sollen.
    Die ViewModels wiederum wissen nix von der View aber die View kennt die Viewmodel... also immer von unten nach oben.

    Stell dir vor in einem WinForms Projekt hast du ein Model (eine Klasse z.Bsp. Fahrzeug), dann hast Du die Oberfläche und, um die Daten (Fahrzeuge) von der Oberfläche zu trenenn, gibt es eine Klasse, wo die ganze Logik zum Laden, Speichern usw. drin ist (z.Bsp. FahrzeugFunctions). Nichts anderes ist es hier in der WPF Model = Fahrzeug, ViewModel = FahrzeugFunction, View = die eigentliche Oberfläche die das ganze anzeigt.

    Der große Unterschied ist das Binding (geht im WinForms aber auch, wenn Du zum Beispiel eine Liste von Fahrzeugen an ein DataGrid bindest, oder an eine Listbox.

    Die ViewModels für deine Models ansich kannst Du ja stumpf kopieren (ohne die DataAnnotations) bei den ViewModels, die Logik enthalten, bekommst du ja dann auch wieder Hilfe.

    Was ich gerne in meinen Projekten verwende ist Foody.Weaver.PropertyChanged, das sorgt dafür, das in allen Klassen, die das INotifyPropertyChanged Interface implementieren, die PropertyChanged automatisch im IL Code hinzugefügt werden, ist ne feine Sache, denn dann kannst Du alle Properties genauso schreiben wie "normale" Properties und die Änderungen werden dennoch mitbekommen.

    aus:

    C#-Quellcode

    1. private string _einString;
    2. public string EinString
    3. {
    4. get => _einString;
    5. set
    6. {
    7. if(_einString != value)
    8. _einString = value;
    9. OnPropertyChanged();
    10. }
    11. }


    wird dann:

    C#-Quellcode

    1. public string EinString {get;set;}


    das macht das ganze etwas einfacher und übersichtlicher. Dennoch kannst du zu jeder Zeit OnPropertyChanged(); aufrufen, oder auch Properties mit Logik verwenden.

    Denk nochmal drüber nach, Du bekommst hier echt super Hilfe und @Nofear23m gibt sich wirklich sehr viel Mühe, es verständlich zu erklären...
    "Hier könnte Ihre Werbung stehen..."
    Denk nochmal drüber nach, Du bekommst hier echt super Hilfe und @Nofear23m gibt sich wirklich sehr viel Mühe, es verständlich zu erklären...


    Ich weiss auch sehr zu schätzen das Nofear sich die mühe gibt, aber wie er selbst schon geschrieben hat, macht es keinen Sinn wenn ich die Grundlagen der Sprache nicht drauf habe, da diese allerdings für mich
    einfach deutlich zu kompliziert sind, könnte er jetzt Monate damit zubringen zu versuchen mir das in den Kopf zu hämmern. Des weiteren hat er leider Vollkommen Recht, das was er Vorteile nennt, sehe ich hier
    nicht, mich interessiert an der WPF tatsächlich nur das die Controls Vector-Basiert sind, das es Transparenz und Effekte gibt, und Templates für die ListBox, der Rest ist für mich einfach nicht relevant, insbesondere
    jetzt das ich weis welch exorbitanter Aufwand notwendig ist, für diese paar kleinen Vorteile, aber da bin ich vermutlich eh der einzige der es so sieht.

    Wenn ich in so eine Viewmodelklasse reingucke, krieg ich instant den Drang aufzuhören. Commands, Iview und lauter Zeug das ich wohl auch nie begreifen werde. Erschwerend hinzukommt dann noch das
    man auch noch die Xaml braucht (Was wenn man sein Tutorial-Inhaltsverzeichnis sieht mehr als eine Lebenszeit braucht um das zu kapieren)

    Ich weis ja das der gängige Tenor hier im Forumist möglichst alles zu trennen Stichwort OOP, aber ich hab es jetzt echt versucht, ich mag CodeBehind. Alles was passiert kann ich da nach
    lesen wo es passiert. Aber auch hiermit steh ich allein auf weiter flur.

    Ich denke also nicht das es Sinn hat es weiter zu versuchen.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    MichaHo schrieb:

    die PropertyChanged automatisch im IL Code hinzugefügt werden, ist ne feine Sache

    So wie ich das sehe wird hier aber PropertyChanged in JEDES Property eingefügt welches einen Setter besitzt. Das muss man sich im klaren sein.
    Ich habe es oft das ich das gar nicht will, oder nur unter gewissen umständen Benachrichtigen will - ist auch eine Performacesache. Deshalb bin ich kein Freund davon.

    Wie ist das eigendlich mit Virenscanner, schlägt der dann gar nicht an?? Würde mich im Grunde wundern.

    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. ##

    Hi,
    Mit Vierenscanner hatte ich bisher keine Probleme.
    Und es gibt Annotations für Foody, da kann man solche Singe abschalten.
    Edit: Foody ersetzt die normalen Propertys durch die ausgeschriebenen Propertys beim kompilieren... Sorry, war etwas falsch ausgedrückt.
    "Hier könnte Ihre Werbung stehen..."

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