WPF-TextBox-Wert ändert sich nicht auf OnPropertyChanged
Habe ich ein Textfeld, dessen Wert ist gebunden an eine ViewModel-Eigenschaft:
<TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding Mode=TwoWay, Path=RunAfter}" Style="{StaticResource TestStepTextBox}"/>
Den set-und get-waren in Ordnung arbeiten, bis ich versuchte, hinzufügen, dass einige Validierung, wenn der Wert gesetzt ist:
private int _runAfter = 0;
public string RunAfter
{
get
{
return _runAfter.ToString();
}
set
{
int val = int.Parse(value);
if (_runAfter != val)
{
if (val < _order)
_runAfter = val;
else
{
_runAfter = 0;
OnPropertyChanged("RunAfter");
}
}
}
}
Obwohl die OnPropertyChanged erreicht ist (ich habe dubugged), wird die Ansicht nicht geändert.
Wie kann ich diese Arbeit machen?
Dank,
José Tavares
InformationsquelleAutor jpsstavares | 2010-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, das Sie aktualisieren die Quelle für die
Binding
während derBinding
aktualisiert Ihre Immobilie. WPF wird nicht tatsächlich überprüfen Sie Ihr Eigentum Wert, wenn es wirft diePropertyChanged
Ereignis in Reaktion auf eineBinding
update. Sie können dieses Problem durch die Verwendung derDispatcher
verzögern die Ausbreitung der Veranstaltung in diesem Zweig:Update:
Die andere Sache, die mir aufgefallen ist, dass die
Binding
auf IhreTextBox
ist die Verwendung der StandardUpdateSourceTrigger
, was passiert, wenn dieTextBox
Fokus verliert. Sie werden nicht sehen Sie den text ändern auf 0 zurück, erst nach derTextBox
Fokus verliert mit diesem Modus. Wenn Sie es ändern, umPropertyChanged
wird, sehen Sie dies sofort geschehen. Ansonsten Ihr Eigentum nicht erhalten, bis IhrTextBox
Fokus verliert:Okay, getestet habe ich dieses heraus, und es funktionierte gut (wenn Sie mit der Tabulatortaste Weg aus der TextBox als der Standard-Modus der Bindung nicht aktualisieren Sie die Eigenschaft, bis das Textfeld den Fokus verliert). Ich aktualisierte die Antwort zu erklären, über die UpdateSourceTrigger auf die Bindungen, im Fall, dass das Verhalten, das Sie sehen. Ich beschäftige mich nicht viel mit WPF gehostet in WinForms, aber ich sehe nicht, warum das Auswirkungen auf die Bindung oder Dispatcher Ihren Kontext.
InformationsquelleAutor Abe Heidebrecht
Ein paar Dinge, die ich bemerkte hier.
Es sei denn, Sie haben einen zwingenden Grund für das freilegen der RunAfter Eigenschaft als string, es gibt keinen Grund, warum es kann nicht sein, eine int. Das wäre speichern Sie die Darsteller in den setter (sowie einem lauernden möglich InvalidCastException, wenn der Benutzer etwas nicht-ganze Zahl im Bereich).
Zweitens, die OnPropertyChanged () - Aufruf auftreten sollten außerhalb der inneren if-Anweisung wie die folgende:
Da die _runAfter lokale aktualisiert wird in beiden Pfaden der Vorbehaltsware, die OnPropertyChanged() aufgerufen werden, unabhängig von der Niederlassung übernommen. Ich hoffe, das hilft zeigen Sie in die richtige Richtung!
Gut, der Satz wird als durch die Sicht (über binding), so dass ich dachte, es wäre nur notwendig, rufen OnPropertyChanged wenn der Wert geändert werden würde, aus der man setted in der Ansicht.
Sowieso, das hat nicht mein problem zu lösen...
Unabhängig davon, wie der setter aufgerufen wird, jede änderung erhöhen muss das PropertyChanged-Ereignis ließ die Zuhörer wissen, dass Sie müssen aktualisieren Sie Ihren Wert. Haben Sie sah über ValidationRules für das tun der Validierung eher als Einbettung in Ihre setter-code? msdn.microsoft.com/en-us/library/...
InformationsquelleAutor Eric Olsson
Hatte ich die gleiche situation. Ich schrieb das folgende, und es funktionierte.
<TextBox Grid.Column="3" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=FirstName}"></TextBox>
Und
InformationsquelleAutor Horizon