| 

.NET C# Java Javascript Exception

2
Tippt man in die TextBox Text ein, dann wird das auch durchgereicht an die darunterliegende Datenstruktur. Wenn ich aber über sowas wie
myTextBox.Text = "Neuer Text";


das Text-Property durch das Programm setze, kommt die Änderung nicht in der angebundenen Datenstruktur an, obwohl sie in der TextBox angezeigt wird.
Beim Herumprobieren hab ich festgestellt, dass mit
myTextBox.Focus();


die Datenbindung funktioniert. Aber das kann es ja wohl nicht sein, dass ich den Focus setzen muss.
News:
22.03.2011
Puster Hans 33 1 1 4
3 Antworten
4
Weil die TextBox per Default die Binding-Source erst aktualisiert wenn die TextBox den Focus verliert wird der Wert wenn du ihn per Property setzt nicht an das Property weitergereicht.

Um das gewünschte Verhalten zu erreichen reicht es wenn das Default Verhalten im XAML abgeändert wird:
Text="{Binding StringProp, UpdateSourceTrigger=PropertyChanged}"
Jetzt wird der Wert bei jeder Änderung durchgeschrieben.
22.03.2011
wurzelchen 289 5
Genau das hat gefehlt. Vielen Dank.
Puster Hans 23.03.2011
2
Auch wenn das geholfen hat, Du fährst auf Dauer u.U. besser damit, wenn Du nicht die Texteigenschaft mit einem Wert füllst, sondern die damit verbundene Property nimmst. Solltest Du mal auf MVVM umsteigen, musst Du es sowieso so machen.
Jens Duczmal 23.03.2011
Prinzipiell finde ich hat Jens schon recht - allerdings sollte das Binding bei einer TextBox sicher in beide Richtungen funktionieren, egal ob ein Benutzer was eingibt oder Code, dafür find ich das absolut legitim...
Und dann gibt's natürlich auch den Fall dass ein Objekt das INotify gar nicht implementiert gebunden werden soll ....
wurzelchen 24.03.2011
3
Wäre es nicht die bessere Alternative, anstatt der Text-Eigenschaft einen Wert zuzuordnen, gleich direkt die damit gebundene Property zu nehmen? Diese ruft im Setter dann NotifyPropertyChanged auf und damit aktualisiert sich Deine Textbox automatisch.
22.03.2011
Jens Duczmal 2,6k 1 3 9
Jens Duczmal 2,6k 1 3 9
3
Wie Jens schon sagt, kannst du das erreichen, indem man die Schnittestelle INotifyPropertyChanged implementiert:

//: INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

private string _privatePropertyName;
public string ViewModelPropertyName
{
get
{
return _privatePropertyName;
}
set
{
_privatePropertyName = value;
OnPropertyChanged("ViewModelPropertyName");
}


}


Wenn Du nun den DataContext setzt (myTextBox.DataContext) oder direkt an ein ViewModel
MeinUserControl.DataContext = MeinViewModel;

dann kannst du die Text Property an das ViewModelProperty binden:
<TextBox Text = "{Binding ViewModelPropertyName}" />



Wenn du im Code ViewModelPropertyName änderst, so änderst du auch den Inhalt der Textbox.
22.03.2011
Mario Priebe 6,0k 3 9
MVVM für ne kleine TextBox??
Timo Liebetrau 23.03.2011
nein, prinzipiell sollte MVVM als Pattern verwendet werden ;)
Mario Priebe 23.03.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH