J'ai une propriété de base qui stocke un objet de type Fruit:
Fruit food;
public Fruit Food
{
get {return this.food;}
set
{
this.food= value;
this.RefreshDataBindings();
}
}
public void RefreshDataBindings()
{
this.textBox.DataBindings.Clear();
this.textBox.DataBindings.Add("Text", this.Food, "Name");
}
J'ai donc mis this.Food
en dehors du formulaire, puis il apparaît dans l'interface utilisateur.
Si je modifie this.Food
, il se met à jour correctement. Si je modifie l'interface utilisateur par programme comme:
this.textBox.Text = "NewFruit"
, il ne met pas à jour this.Food.
Pourquoi cela pourrait-il être? J'ai également implémenté INotifyPropertyChanged
pour Fruit.Name, mais toujours le même.
Je vous recommande de mettre en œuvre INotifyPropertyChanged et de changer votre code de liaison de données en ceci:
this.textBox.DataBindings.Add("Text",
this.Food,
"Name",
false,
DataSourceUpdateMode.OnPropertyChanged);
Ça va le réparer.
Notez que la valeur par défaut DataSourceUpdateMode
est OnValidation
. Par conséquent, si vous ne spécifiez pas OnPropertyChanged
, l'objet de modèle ne sera mis à jour que lorsque vos validations auront été effectuées.
Vous avez besoin d'un objet bindingsource pour agir en tant qu'intermédiaire et aider à la liaison. Ensuite, au lieu de mettre à jour l'interface utilisateur, mettez à jour le modèle de soulignement.
var model = (Fruit) bindingSource1.DataSource;
model.FruitType = "oranges";
bindingSource.ResetBindings();
Consultez BindingSource et la liaison de données simple pour Windows Forms .
Nous pouvons utiliser le code suivant
textBox1.DataBindings.Add("Text", model, "Name", false, DataSourceUpdateMode.OnPropertyChanged);
Où
"Text"
- la propriété de textbox model
- l'objet modèle entrez le code ici "Name"
- la valeur du modèle auquel lier la zone de texte.