Wpf ohne INotifyPropertyChanged

    • WPF

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

      Wpf ohne INotifyPropertyChanged

      Zu meiner eigenen Verdutzung stellte ich fest, dass folgendes läuft wie geschmiert:

      VB.NET-Quellcode

      1. Public Class MainModel
      2. Public Property Text() As String = "Hallo Wald!"
      3. End Class

      XML-Quellcode

      1. <Window x:Class="MainWindow"
      2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      4. xmlns:my="clr-namespace:NoPropertyChanged" >
      5. <FrameworkElement.DataContext>
      6. <my:MainModel/>
      7. </FrameworkElement.DataContext>
      8. <Grid>
      9. <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
      10. <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Right" VerticalAlignment="Top"/>
      11. </Grid>
      12. </Window>
      Hexerei: Beide Textboxen sind synchron.
      Und das funktioniert auch mit komplizierteren Models, auch mit Objekten in Listen und whatever.



      Aber
      Wenn codeseitig eine Property geändert wird - das kriegt die View dann doch nicht mit - sodass man dann eben doch wieder INotifyPropertyChanged implementieren muss.
      Ja, und wenn es dann implementiert ist - oh! :| - dann geht obige Hexerei auf einmal nicht mehr :( .
      Und die Synchronizität der beiden Textboxen stellt sich erst wieder ein, wenn man auch das PropertyChanged-Event feuert. :P
      INotifyPropertyChanged-Prinzip

      VB.NET-Quellcode

      1. 'für die Praxis nicht empfohlen, denn man wird eh Infrastruktur-Code einbinden müssen, und da sollte es eine Basisklasse geben, die INotifyPropertyChanged abdeckt
      2. Imports System.ComponentModel
      3. Public Class MainModel
      4. Implements INotifyPropertyChanged
      5. Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
      6. Private _Text As String = "Hallo Wald!"
      7. Public Property Text() As String
      8. Get
      9. Return _Text
      10. End Get
      11. Set(ByVal value As String)
      12. If _Text = value Then Return
      13. _Text = value
      14. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Text"))
      15. End Set
      16. End Property
      17. End Class

      Dateien

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

      Moin,

      ist ja gut und recht, aber ich frage mich jetzt, was das jetzt bringt. Wenn man ​INotifyPropertyChanged nicht implementiert, dann bringt einem ja das ganze MVVM-Pattern sowieso nichts und dass man die Methoden, Properties und Events implementieren muss, wenn man ein Interface implementiert, ist doch auch klar.
      Das ist doch selbstverständlich logisch. :D Oder willst Du darauf hinaus, dass man beim DataContext da eine Meldung bekommen sollte?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: