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:
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?
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.
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. –