Question

J'ai la classe suivante

public class Car
{
   public Name {get; set;}
}

et je veux lier ceci par programme à une zone de texte.

Comment je fais ça?

Prendre des photos dans le noir:

...
Car car = new Car();
TextEdit editBox = new TextEdit();
editBox.DataBinding.Add("Name", car, "Car - Name");
...

J'obtiens l'erreur suivante

  

& "; Impossible de se lier à la propriété" Nom "sur le contrôle cible.

Qu'est-ce que je fais de travers et comment devrais-je le faire? Je trouve le concept de liaison de données un peu difficile à saisir en raison du développement Web.

Était-ce utile?

La solution

vous voulez

editBox.DataBindings.Add("Text", car, "Name");

Le premier paramètre est le nom de la propriété sur le contrôle que vous souhaitez associer aux données, le second est la source de données, le troisième paramètre est la propriété sur la source de données à laquelle vous souhaitez créer un lien.

Autres conseils

Sans regarder la syntaxe, je suis presque sûr que c'est:

editBox.DataBinding.Add("Text", car, "Name");
editBox.DataBinding.Add("Text", car, "Name");

Le premier argument est le nom de la propriété de contrôle, le second est l'objet à lier et le dernier, le nom de la propriété de l'objet que vous souhaitez utiliser en tant que source de données.

Vous êtes assez proche de la ligne de liaisons de données

editBox.DataBinding.Add("Text", car, "Name");

Ce premier paramètre est la propriété de votre objet editbox qui sera lié aux données. Le deuxième paramètre est la source de données à laquelle vous vous associez et le dernier paramètre est la propriété de la source de données à laquelle vous souhaitez vous associer.

N'oubliez pas que la liaison de données est un moyen. Par conséquent, si vous modifiez la zone d'édition, l'objet car est mis à jour, mais si vous modifiez directement le nom de la voiture, la zone d'édition n'est pas mise à jour.

Essayez:

editBox.DataBinding.Add( "Text", car", "Name" );

Je crois que

editBox.DataBindings.Add (new Binding ("Texte", voiture, "Nom"));

devrait faire l'affaire. Je ne l'ai pas essayé, mais je pense que c'est l'idée.

Vous essayez de vous connecter au " Nom " du contrôle TextEdit. Le nom est utilisé pour accéder au contrôle par programme et ne peut pas être lié. Vous devriez être contraignant contre le texte du contrôle.

Ce qui suit est une classe générique qui peut être utilisée en tant que propriété et implémente INotifyPropertyChanged utilisé par les contrôles liés pour capturer les modifications de la valeur de la propriété.

public class NotifyValue<datatype> : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    datatype _value;
    public datatype Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Value"));
        }
    }

}

Il peut être déclaré comme ceci:

public NotifyValue<int> myInteger = new NotifyValue<int>();

et attribué à une zone de texte comme celle-ci

Textbox1.DataBindings.Add(
    "Text", 
    this, 
    "myInteger.Value", 
    false, 
    DataSourceUpdateMode.OnPropertyChanged
);

.. où " Texte " est la propriété de la zone de texte, "ceci" est l'instance actuelle du formulaire.

Une classe n'a pas à hériter de la classe INotifyPropertyChanged. Une fois que vous avez déclaré un événement de type System.ComponentModel.PropertyChangedEventHandler, l'événement de changement de classe sera abonné par la commande databinder

.

Utilisation de la syntaxe C # 4.6:

editBox.DataBinding.Add(nameof(editBox.Text), car, nameof(car.Name));

si car est null, alors le code ci-dessus échouera de manière plus visible que d'utiliser une chaîne littérale pour représenter le datamember de car

c'est

 this.editBox.DataBindings.Add(new Binding("Text", car, "Name"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top