2013-06-02 5 views
0

Ici, je parle de l'application Windows Forms écrite en C#. Considérons un modèle simpleComment faire Microsoft.VisualBasic.PowerPacks.DataRepeater mettre à jour instantanément les données liées?

class Labelled 
{ 
    private string label; 
    public string Label 
    { 
     get { return label; } 
     set 
     { 
      if (label != value) 
      { 
       string message = String.Format(
        "Label changed from {0} to {1}", 
        label, value 
       ); 
       MessageBox.Show(message); 
       label = value; 
      } 
     } 
    } 

    public Labelled(string label) 
    { 
     this.label = label; 
    } 
} 

class Model 
{ 
    public Labelled SingularLabelled { get; set; } 

    public List<Labelled> ListedLabelled { get; set; } 

    public Model() 
    { 
     SingularLabelled = new Labelled("Singular"); 

     ListedLabelled = new List<Labelled>(); 

     for (int i = 1; i <= 10; ++i) 
      ListedLabelled.Add(new Labelled("Listed " + i.ToString())); 
    } 
} 

Nous avons une classe simple Labelled avec propriété de chaîne Label et classe Model avec un membre SingularLabelled de type Labelled et ListedLabelled qui est une liste de Labelled « s.

Maintenant, je veux afficher les données à l'utilisateur. Voici ma configuration:

Main window and data bindings

La fenêtre principale a un TextBox pour afficher SingularLabelled.Label et un DataRepeater des PowerPacks Visual Basic pour afficher les étiquettes des éléments de ListedLabelled. Le ItemTemplate du DataRepeater se compose d'un seul TextBox.

Concentrons-nous sur la liaison unidirectionnelle, à savoir que je veux que les données sous-jacentes soient mises à jour lorsque l'utilisateur modifie le contenu d'une zone de texte. La propriété Label du Labelled déclenche une notification sous la forme d'une boîte de message, afin que je puisse savoir exactement quand les données sont mises à jour. Maintenant, les flèches représentent des liaisons. Les flèches bleues représentent la source de données et les rouges les données des membres. Une instance de Model est créée et liée au modelBindingSource dans le constructeur de la fenêtre principale.

Et là, nous arrivons à une chose très importante. Je veux mettre à jour les données immédiatement en synchronisation avec ce que l'utilisateur est en train de taper, donc j'ai vérifié que les modes de mise à jour de la source de données des liaisons de données sont réglés sur OnPropertyChanged. Le code généré qui pourrait intéresser est ici

this.singularTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.modelBindingSource, "SingularLabelled.Label", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 
this.listedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listedLabelledBindingSource, "Label", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

Et cela fonctionne comme prévu lors de la saisie dans la zone de texte de SingularLabelled mais les zones de texte dans les DataRepeater trigger la mise à jour seulement quand ils se concentrent en vrac. Je veux qu'ils se comportent comme le singulier. La solution idéale serait de le faire en utilisant le concepteur. Est-ce que quelqu'un sait comment faire ça?

SingularLabelled label update

ListedLabelled label update

ci-dessus est un échantillon du travail du programme. Remarquez comment le libellé de SingularLabelled est mis à jour chaque caractère entré et les membres de ListedLabelled obtiennent la mise à jour de l'ensemble du bloc édité après que la zone de texte correspondante ait perdu son focus.

Répondre

1

Nous avons réussi à surmonter cette limitation de DataRepeater en simulant la touche de tabulation.

private void listedTextBox_TextChanged(object sender, EventArgs e) 
    { 
     //simulate tab key to force databinding 
     SendKeys.Send("{TAB}"); 
     SendKeys.Send("+{TAB}"); 
    } 
+0

C'est une proposition intéressante. Néanmoins, pour l'instant, je viens de laisser tomber le 'DataRepeater' et assemblé mon propre contrôle similaire à celui qui n'a pas ce problème. –

Questions connexes