Liaison de données pour TextBox
J'ai une propriété de base, qui stocke un objet de type Fruits:
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 cela.Aliment.
Pourquoi cela pourrait-il être? J'ai également implémenté INotifyPropertyChanged
pour Fruit.Name, mais toujours le même.
4 réponses
Je vous recommande d'implémenter INotifyPropertyChanged et de changer votre code de liaison de données à ceci:
this.textBox.DataBindings.Add("Text",
this.Food,
"Name",
false,
DataSourceUpdateMode.OnPropertyChanged);
Ça va arranger ça.
Notez que la valeur par défaut DataSourceUpdateMode
est OnValidation
, donc si vous ne spécifiez pas OnPropertyChanged
, l'objet modèle ne sera pas mis à jour tant que vos validations n'auront pas eu lieu.
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();
Lisez sur 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 pour lier la zone de texte.
Vous ne pouvez pas databind à une propriété, puis attribuer explicitement une valeur à la propriété databound.