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.

28
demandé sur abatishchev 2009-10-24 01:30:18

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.

57
répondu Joepro 2016-02-13 15:42:04

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 .

1
répondu Mickey Perlstein 2014-08-06 15:08:57

Nous pouvons utiliser le code suivant

textBox1.DataBindings.Add("Text", model, "Name", false, DataSourceUpdateMode.OnPropertyChanged);

  • "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.
0
répondu user3838082 2017-07-16 11:17:15

Vous ne pouvez pas databind à une propriété, puis attribuer explicitement une valeur à la propriété databound.

-2
répondu Hasani Blackwell 2009-10-23 21:31:43