web-dev-qa-db-fra.com

Liaison de données pour TextBox

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.

28
Joan Venge

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.

57
Joepro

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 .

1
Mickey Perlstein

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.
0
user3838082