Support, Anregungen, Wünsche zur Tutorialreihe <WPF lernen/>

  • WPF MVVM

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

    Joshi schrieb:

    Die erste Lösung war mit einfachen Events in beiden VieModels, die natürlich die MVVM-Doktrin "Violataten".

    Naja, im Grunde sind Events ja nicht Böse und verletzen in keinster weise das Pattern, kann man also so machen. Mache ich auch hier und da.

    Joshi schrieb:

    Danach stolperte ich über eine Messenger Lösung.

    Ja, die Messanger können schon helfen. Ich bin ja auch schon am überlegen ob ich die Messenger auch behandle.
    Ich glaube ich nehme mir die mal mit und werde das Thema auch durchgehen, ist ja evtl. für einige doch durchaus hilfreich.
    Ich bin nur nach ner weile drauf gekommen das man fast immer nur Messenges wenn eben wie du schreibst das VM-Design nicht wirklich passt und man "hinten rum" arbeiten muss. So kann man mit Messenger-Konstrukten natürlich einen Workaround schaffen.

    Joshi schrieb:

    Ich gehe davon aus, das dein Video über Services einen neuen "Ansatz" liefert.

    Ja, ich gehe bei den Services darauf ein wie man solche Dinge lösen kann, aber wie gesagt werde ich gleich drauf auch Services machen.
    Die muss ich mich nur schnell mal wieder "ausbuddeln", habe ich schon lange nicht mehr verwendet.

    Joshi schrieb:

    Das Video wird als Full-HD "gelistet", es ist schwer leserlich.

    Ja, das ist mir auch aufgefallen, danke für den Hinweis das es wirklich bei anderen auch so ist. Im Original ist es super scharf, aber die YT Komprimierung ist da echt doof.
    Ich werde das nächste Video mal anders exportieren und da etwas rumtesten, am Anfang waren sie ja besser.

    Danke fürs Feedback!!
    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. ##

    Von mir mal ein Dickes, Fettes Danke für das PDF Dokument und die Videos.

    Da ich nicht immer die Videos schauen kann, ist das PDF Dokument super hilfreich und kann auch im stillen sehr gut konsumiert werden!
    Hallo

    Ich weis, es hat lange gedauert.
    Das Kapitel "Services" ist nun mal Online.
    Sollte in Bezug auf Services noch Fragen sein kann ich diese ins nächste Video einfließen lassen wenn diese Zeitnah gestellt werden.

    6.4 - Services

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

    Hallöle

    Erstmal ein großes Sorry das ist hier so lange nicht aktiv war. Ich hatte Beruflich extrem viel zu tun und hatte wenig Zeit.
    In der mir verbliebenen Zeit hatte ich die Kraft nicht "umzudenken" da ich Beruflich gerade sehr viel ASP.Net Blazor unter C# progge und hier sehr stark umdenken musste.
    Ich hatte versucht ein Kapitel anzufangen - ging voll in die Hose da ich immer wieder anfing C# zu schreiben. ;)
    Mag der Compiler leider garnicht. 8o

    Dennoch hatte ich mir schon gedacht das gerade beim Kapitel Services weit mehr Fragen kommen würden, das wundert mich.
    Hats keiner gesehen oder traut sich niemand oder was ist hier los? Das gerade bei diesem Thema keine Fragen kommen lässt mich etwas an der Tutorialreihe zweifeln.
    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. ##

    Hab selbst wenig Zeit ;)

    Bin gerade dabei, wie von dir angeraten, mein Modul in eine ServiceKlasse zu verwandeln, um von überall aus drauf zugreifen zu können.

    Problem: Jetzt habe ich in meinem Modul einige Arrays gehabt wie z.B.:
    Public streamfx() As Integer = {0, 0}

    Sieht im Interface dann so aus:
    Property streamfx() As Integer

    Dann hab ich in meiner Klasse in meinem Ordner "Services" mein Interface implementiert:

    VB.NET-Quellcode

    1. Public Class ZentraleKlasse
    2. Inherits ViewModel.Instrastructure.ViewModelBase
    3. Implements ViewModel.Services.IZentraleKlasse


    So, jetzt wird mir Folgendes automatisch geliefert:

    VB.NET-Quellcode

    1. Public Property streamfx As Integer Implements IZentraleKlasse.streamfx
    2. Get
    3. Throw New NotImplementedException()
    4. End Get
    5. Set(value As Integer)
    6. Throw New NotImplementedException()
    7. End Set
    8. End Property


    Ich will es so initialisieren:

    VB.NET-Quellcode

    1. Public Sub New()
    2. streamfx() = {0, 0}
    3. End Sub


    Geht aber natürlich nicht. Der Wert vom Typ Integer() kann nicht in Integer konvertiert werden.
    Kann man eine Property nicht als Array machen? Wie initialisiere ich das sonst? Im Interface werden ja keine Initialisierungen erlaubt...

    Edit: In etwa so? :

    VB.NET-Quellcode

    1. Private f_Items(17) As Integer
    2. Public Property Item(ByVal Index As Integer) As Integer
    3. Get
    4. Return f_Items(Index)
    5. End Get
    6. Set(ByVal value As Integer)
    7. f_Items(Index) = value
    8. End Set
    9. End Property


    Edit2:
    Also funktionieren tuts jedenfalls :whistling:

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

    kafffee schrieb:

    Dann hab ich in meiner Klasse in meinem Ordner "Services" mein Interface implementiert

    Wer hat dir das denn gesagt?

    Warum ist "Zerntale Klasse" ein ViewModel (weil es ja INotifypropertyChanged implementiert)?
    Ist das so gewollt?
    Ein Service ist kein ViewModel.
    Wie rufst du das Service auf? Kannst du das zeigen?

    Da es eine normale Klasse darstellt funktioniert diese genau gleich wie dein Modul.
    Kann es sein das du Option Strict Off arbeitest?

    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 schrieb:

    kafffee schrieb:
    Dann hab ich in meiner Klasse in meinem Ordner "Services" mein Interface implementiert

    Wer hat dir das denn gesagt?


    Ich hab versucht, das analog zu deinem Beispiel in Kapitel 6.4 zu machen. Kann sein, dass ich mich lediglich falsch ausgedrückt habe, es aber trotzdem richtig gemacht habe. Jedenfalls ist Public Class ZentraleKlasse bei mir im App-Projekt im Ordner Services (ich benutze dein MultiProject Template).

    Nofear23m schrieb:

    Warum ist "Zerntale Klasse" ein ViewModel (weil es ja INotifypropertyChanged implementiert)?


    Genau. Ich habe Inherits ViewModel.Instrastructure.ViewModelBase gemacht weil ich meine Properties mit RaisePropertyChanged machen möchte. Oder hab ich da grundlegend was falsch verstanden??

    Nofear23m schrieb:

    Wie rufst du das Service auf? Kannst du das zeigen?


    In allen meinen ViewModels hab ich das hier:

    Private MainModule As Services.IZentraleKlasse = Services.ServiceContainer.GetService(Of Services.IZentraleKlasse)

    Und dann einfach z.B.:

    MainModule.InhaltGesamt.Add(New ViewModel.MP3FileInfoVM(...))

    ViewModel.MP3FileInfoVM ist dabei die Klasse, die mein MP3FileInfo im Model abstrahiert.

    Nofear23m schrieb:

    Da es eine normale Klasse darstellt funktioniert diese genau gleich wie dein Modul.


    Zumindest so wie ich es jetzt habe funktioniert auch alles. Obwohl ich das Modul jetzt nicht einfach 1:1 in ZentraleKlasse reinkopieren konnte. Musste z.B. meine Variablen in Properties umwandeln...

    Nofear23m schrieb:

    Kann es sein das du Option Strict Off arbeitest?


    Ne mach ich generell nicht...
    Ok, ich war nur verwirrt wegen INotifyPropertyChanged.
    Warum brauchst du den Machanismus? Normalerweise bindet man nicht direkt auf Serviceinstanzen. Aber gut, solange es bei dir funktioniert gut, aber Normalerweise nicht üblich. Aber viele wege führen nach Rom.

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

    kafffee schrieb:

    Ja ich binde nicht direkt drauf.

    Dann brauchste auch kein INotifyPropertyChanged und kannst normale Properties in kurzer Schreibweise draus machen.
    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. ##

    Ah okay dachte ich mir schon. Hab das halt mal zur Sicherheit gemacht, kann nicht schaden.

    Um das .Refresh() zum neu filtern einer CollectionView komm ich aber nicht rum, oder?

    Siehe https://www.vb-paradise.de/index.php/Thread/135740-CollectionViewSource-View-updaten-wenn-in-GetDefaultView-festgelegte-Quelle-sich/?postID=1173161#post1173161

    Das war ja das ursprüngliche Problem.... (letzter Post unter "Edit") beschreibt das Problem kurz und knackig
    Ja, wenn du Filter hast musst du mittels .Refresh das Filtern neu anstoßen sollten sich Eigenschaften in der Zwischenzeit geändert haben.
    Das ist normal und aus Performancegründen so.

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

    Hey NoFear23m, erstmal ein Dankeschön für dein Tutorial. Ich lerne grad WPF mit MVVM, das Tutorial ist ein super Werk zum nachschauen, hat mir schon mehrmals geholfen. :thumbup: Da solltest du ein Buch draus machen, hatte mir kürzlich ein kleines Buch über MVVM gekauft, hätte ich mir sparen können. Hatte schon während das Buch unterwegs war hier und da über MVVM gelesen, ein paar der Videos von deinem Tutorial die mich am meisten interessierten gesehen, ich wäre auch ohne dieses Buch klar gekommen. Jedenfalls finde ich in dem Tutorial mehr Informationen als in dem Buch. Wobei schlecht ist es nicht, Schulnote würde ich Befriedigend geben, dein Tutorial schneidet da besser ab.(hab deswegen das Dashboard voll gespammt mit den ganzen Hilfreich-Klicks) :D


    Ich hatte bemerkt das Videos vom Tutorial auf YT fehlen beim durchscrollen, bei 3.1 und 3.2 steht "Video nicht verfügbar". Weiß nicht ob Absicht, aber sollte editiert werden wenn.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    Das ist Absicht. Bin ich auch drüber gestolpert. Im Text und im Inhaltsverzeichnis steht, dass das Kapitel weggelassen wird, da kein Zusatznutzen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo @BitBrösel und erstmal danke für dein Lob und die Hilfreich klicks. ;)

    Ja, einige Kapitel musste ich dann weglassen da ich mittendrinn bemerkte das diese zu mehr Fragen geführt hatten als sie beantwortet hatte und so die Leute doch auf eine "falsche" Spur geführt würden.

    Freut mich das dir die Reihe gefällt.
    Wenn ich nur Zeit finden würde weiter zu machen. Mit meinem neuen Job ist das nicht einfach die Energie und Zeit zu finden. Ich habe zwar Hoffnung für die nun kommenden Wintermonate, aber versprechen kann ich leider nichts.

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

    Hallo @Nofear23m :)

    Danke nochmal für den Tip mein Modul als Service umzugestalten, das funktioniert soweit ganz gut.

    An mancher Stelle wär es aber sinnvoll, nicht nur von meinen ViewModels auf den Service zugreifen zu können, sondern auch anders rum, z. B. wenn sich im Service eine Property ändert, eine Property meines ViewModels upzudaten. Oder aber alternativ eine Propertie in der View direkt an eine Propertie des Service zu binden. Letzteres hast du glaube ich schon erwähnt geht, aber ist jetzt net optimal. Ersteres hab ich schon probiert so hinzubekommen bin aber gescheitert. Das mit den Namespaces im Multiproject Template hat mich etwas verwirrt....
    Hallo

    Wir schon mal erwähnt ist es nicht unbedingt eine gute Idee direkt auf ein Service zu binden, auf den erstem Blick steht dem nichts im Wege und wenn die Serviceklasse INotifyPRopertyChanged implementiert wäre das auch soweit möglich, ist aber aus Erfahrung gesprochen keine so gute Idee, warum würde jetzt vermutlich den Rahmen sprengen, da müsste man ausholen.
    Aber... es spricht nichts dagegen mit den Eigenschaften der Serviceklasse genau gleich zu Verfahren wie mit einer Modelklasse.
    Im Grunde ist es ja das selbe.

    Beispiel:


    Angenommen du hättest folgendes Service:

    VB.NET-Quellcode

    1. Public Class TestService
    2. Implements ITestService
    3. Public Property MyProp As String Implements ITestService.MyProp
    4. End Class


    Dann wie folgt in deinem ViewModel die Daten holen und im Setter wieder zurückschreiben.

    VB.NET-Quellcode

    1. ​Public Class MainVm
    2. Inherits Instrastructure.ViewModelBase
    3. Private ReadOnly myServiceInstance As ITestService
    4. Public Sub New()
    5. myServiceInstance = Services.ServiceContainer.GetService(Of ITestService)
    6. End Sub
    7. Public Property TestProperty() As String
    8. Get
    9. Return myServiceInstance.MyProp
    10. End Get
    11. Set(ByVal value As String)
    12. myServiceInstance.MyProp = value
    13. RaisePropertyChanged()
    14. End Set
    15. End Property
    16. End Class


    Fertig.

    Hoffe das ist für dich ein Weg der vertretbar ist.

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

    Jou genauso hab ichs ja schon. Selber drauf gekommen :thumbsup:

    Aber ich brauchs ja genau andersrum, dass wenn eine Property im Service geändert wird, dass dann eine Property im ViewModel geändert wird.

    Ich glaube ich binde das direkt, ist keine grosse Sache, einfach nur eine Checkbox, dessen Property IsChecked von überall her erreichbar sein muss, ich glaube da kann nicht viel schief gehen.

    Nur bin ich mir noch unsicher wie.

    Ich hatte gedacht, ich hole mir den Namespace Services in meine View. Dann lege ich den DataContext meiner Checkbox auf den Service:

    XML-Quellcode

    1. xmlns:ZK="clr-namespace:VamosALaPlayer_3._0.ViewModel.Services;assembly=VamosALaPlayer_3._0.ViewModel"


    XML-Quellcode

    1. <Checkbox IsChecked="{Binding OffLineMode}" DataContext="ZK:IZentraleKlasse"/>


    Aber das funktioniert so nicht, irgendwas mach ich falsch...:

    'OffLineMode' property not found on 'object' ''String' (HashCode=1811815347)'. BindingExpression:Path=OffLineMode; DataItem='String' (HashCode=1811815347); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')

    Kannst du mich auf den richtigen Weg bringen? Ist ja glaube ich nur ein Syntaxfehler...
    Hallo

    Das kann nicht funktionieren.
    Du musst dein Service in dein ViewModel holen...

    VB.NET-Quellcode

    1. ​Public Property MyServiceInstance As MyTestService


    Im Konstructor des ViewModels setzt du die Referenz drauf:

    VB.NET-Quellcode

    1. ​MyServiceInstance = ServiceContainer.GetService<IMyTestService>()


    Und bindest dann z.b. mit ​{Binding MyServiceInstance.OffLineMode}

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