Zu meiner eigenen Verdutzung stellte ich fest, dass folgendes läuft wie geschmiert:
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
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.
INotifyPropertyChanged-Prinzip
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:my="clr-namespace:NoPropertyChanged" >
- <FrameworkElement.DataContext>
- <my:MainModel/>
- </FrameworkElement.DataContext>
- <Grid>
- <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
- <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Right" VerticalAlignment="Top"/>
- </Grid>
- </Window>
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.
VB.NET-Quellcode
- '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
- Imports System.ComponentModel
- Public Class MainModel
- Implements INotifyPropertyChanged
- Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
- Private _Text As String = "Hallo Wald!"
- Public Property Text() As String
- Get
- Return _Text
- End Get
- Set(ByVal value As String)
- If _Text = value Then Return
- _Text = value
- RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Text"))
- End Set
- End Property
- End Class
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()