Silverlight Checkbox Zweiweg-Bindung nicht wie erwartet funktioniert
-
20-09-2019 - |
Frage
Ich habe einfache Frage eine Zwei-Wege-Datenbindung einer Checkbox in Silverlight 3.0 Einstellung. Es muss ein Kinderspiel sein, aber wahrscheinlich habe ich vergessen, mein Gehirn zu Hause heute ...
I definiert eine Modellklasse meine .. ‚Daten‘ zu repräsentieren. Ich implementiert die INotifyPropertyChanged-Schnittstelle die Benutzeroberfläche zu sehen, wenn die Datenänderungen zu ermöglichen.
public class Model : INotifyPropertyChanged
{
private bool _value;
public bool Value
{
get { return this._value; }
set
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
this._value = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
setzen Next ich eine Checkbox und einen Knopf auf der .. 'Form':
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>
<Button Click="Button_Click" Content="Test" />
</StackPanel>
Dann geliefert ich die Daten im Konstruktor:
public MainPage()
{
InitializeComponent();
this.DataContext = new Model() { Value = true };
}
Das Problem ist, dass Sie zweimal auf das Kontrollkästchen klicken müssen für sie zu aktivieren / deaktivieren, wenn ich die INotifyPropertyChanged de-umzusetzen. Wenn es jedoch de-implementieren, dann die UI nicht bemerkt, wenn ich die zugrunde liegenden Daten ändern.
Wenn ich die Mode = TwoWay aus dem Bit entfernen IsChecked Bindungsausdruck dann auch die UI wird die zugrunde liegende Datenänderung nicht bemerkt, auch wenn das Modell der Schnittstelle implementiert.
Wie kann ich tun, um:
- Haben Sie die auf die Daten beim Start gebunden Checkbox
- Haben Sie das Kontrollkästchen IsChecked Änderung der zugrunde liegenden Daten zu ändern
- Haben Sie das Kontrollkästchen der zugrunde liegenden Datenänderung erkennen und selbst aktualisieren?
Lösung
Sie haben einen Sequenzierungsfehler in Ihrem Set-Eigenschaft Verfahren erhalten, müssen Sie assign zu _value
vor Benachrichtigung der Änderung: -
set
{
this._value = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}