case à cocher Silverlight deux voies de liaison ne fonctionne pas comme prévu
-
20-09-2019 - |
Question
J'ai une simple question mise en liaison de données dans les deux sens d'une case à cocher dans Silverlight 3.0. Il doit être une évidence, mais probablement j'ai oublié ma maison de cerveau aujourd'hui ...
Je défini une classe de modèle pour représenter ma .. « données ». Je mis en œuvre l'interface INotifyPropertyChanged pour permettre l'interface utilisateur de voir quand les données changent.
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;
}
Ensuite, je mis une case à cocher et un bouton sur la .. « forme »:
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>
<Button Click="Button_Click" Content="Test" />
</StackPanel>
Ensuite, je fourni les données dans le constructeur:
public MainPage()
{
InitializeComponent();
this.DataContext = new Model() { Value = true };
}
Le problème est que vous devez cliquer deux fois sur la case à cocher / décocher à moins que je de-Mettre en oeuvre le INotifyPropertyChanged. Si de-mettre en œuvre cependant, l'interface utilisateur ne remarque pas si je change les données sous-jacentes.
Si je supprime le mode = bit TwoWay de l'expression de liaison IsChecked alors aussi l'interface utilisateur ne remarquera pas la modification des données sous-jacentes, même si le modèle met en œuvre l'interface.
Comment puis-je faire pour:
- Avoir la case liée aux données au démarrage
- Avoir la case à cocher isChecked changer pour modifier les données sous-jacentes
- Avez la case à cocher détecter le changement de données sous-jacentes et de se mettre à jour?
La solution
Vous avez une erreur de séquençage dans votre procédure de propriété définie, vous devez attribuer à _value
avant notification au changement: -
set
{
this._value = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}