2010-07-08 3 views
2

Je suis novice en C# et databinding, et comme une expérience que je tente de lier le texte du titre de forme à une propriété:simple liaison de données entre zone de texte et la forme titre

namespace BindTest 
{ 
    public partial class Form1 : Form 
    { 
     public string TestProp { get { return textBox1.Text; } set { } } 

     public Form1() 
     { 
      InitializeComponent(); 
      this.DataBindings.Add("Text", this, "TestProp"); 
     } 
    } 
} 

Malheureusement, cela ne fonctionne pas. Je soupçonne que cela a quelque chose à voir avec la propriété ne pas envoyer d'événements, mais je ne comprends pas assez sur la liaison de données pour savoir pourquoi exactement.

Si je lie le texte du titre directement à la zone de texte, comme ceci:

this.DataBindings.Add("Text", textBox1, "Text") 

Ensuite, il ne fonctionne correctement.

Toute explication sur la raison pour laquelle le premier exemple de code ne fonctionne pas serait appréciée.

Répondre

3

Vous devez implémenter l'interface INotifyPropertyChanged. Essayez le code suivant et voyez ce qui se passe lorsque vous supprimez NotifyPropertyChanged ("MyProperty"); du setter:

private class MyControl : INotifyPropertyChanged 
{ 
    private string _myProperty; 
    public string MyProperty 
    { 
     get 
     { 
      return _myProperty; 
     } 
     set 
     { 
      if (_myProperty != value) 
      { 
       _myProperty = value; 
       // try to remove this line 
       NotifyPropertyChanged("MyProperty"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

private MyControl myControl; 

public Form1() 
{ 
    myControl = new MyControl(); 
    InitializeComponent(); 
    this.DataBindings.Add("Text", myControl, "MyProperty"); 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    myControl.MyProperty = textBox1.Text; 
} 
+0

+1 pour inclure le gestionnaire TextChanged est nécessaire pour que la propriété soit définie, c'est un autre élément qui me manquait. – WildCrustacean

1

Je pense que vous devez implémenter l'interface INotifyPropertyChanged. Vous devez implémenter cette interface sur les objets métier utilisés dans la liaison de données Windows Forms. Une fois implémentée, l'interface communique à un contrôle lié la propriété change sur un objet métier.

How to: Implement the INotifyPropertyChanged Interface

+0

Merci pour le lien, c'est le gros morceau qui me manquait. Cependant, il semble que la valeur doit toujours être définie à travers la propriété pour que cela fonctionne, donc dans mon exemple, le gestionnaire TextChanged est également requis. – WildCrustacean

Questions connexes