La liaison de l'étiquette à une variable
Je commence tout juste avec WPF et j'essaye de configurer la liaison entre une variable locale et une étiquette. Fondamentalement, je veux mettre à jour les étiquettes lors de la variable locale changements. J'étais à la recherche d'une solution, mais ils ont tous simplement utiliser la zone de texte comme une source non seulement variable de classe et je ne suis même pas sûr que ça fonctionne de cette façon. Voici donc mon code.
public partial class MainWindow : Window
{
int idCounter;
public MainWindow()
{
InitializeComponent();
Binding b = new Binding();
b.Source = idCounter;
b.Mode = BindingMode.OneWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myLabel.SetBinding(Label.ContentProperty,b);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
idCounter++;
}
}
Bouton fonctionne, idCounter change de valeur, mais il ne met pas à jour l'étiquette, donc je suppose que la liaison est mauvaise. Quelqu'un peut me dire quel est le problème? Grâce
Vous devez vous connecter pour publier un commentaire.
Votre code ne fonctionnera que si vous modifiez votre classe à ce...
Certaines des questions que vous aviez sont...
La fenêtre elle-même doit implémenter INotifyPropertyChanged, de sorte que le moteur de liaison pouvez placer une oreille sur celui-ci.
la IdCounter doit être publique, et ont un getter publique sur elle de sorte que la liaison moteur peut " get " il.
Vous devez définir le DataContext à ce que la classe a déclaré IdCounter (le MainWindow dans ce cas). Une partie du problème est que le moteur de liaison n'avait pas de DataContext.
La BindingMode réglage était une diversion depuis une Étiquette lie que par défaut.
La UpdateSourceTrigger était une diversion puisque le contenu de l'étiquette n'est pas un mécanisme pour mettre à jour la source de la propriété. Une étiquette de contenu n'est pas comme une zone de texte où l'utilisateur peut taper quelque chose que le code a besoin de les connaître. Lorsque vous êtes à la liaison à quelque chose que l'utilisateur ne peut pas changer, oublier UpdateSourceTrigger, c'est la Cible propriété qui compte.
Le gestionnaire doit marquer l'événement. C'est une bonne pratique et n'affecte pas la liaison.
La liaison constructeur doit uniquement le chemin d'accès.
Ce code vous donnera le résultat escompté; c'est à dire, que l'étiquette des mises à jour lorsque le bouton est cliqué. Vérifié, compilé et exécuté sur vs2013, .net 4.5.
Les autres répondants ont dit que vous devez utiliser un Modèle de Vue. Je suis d'accord avec ce 100%, et dans l'ensemble c'est une bonne chose à considérer.
inherit
de INotifyPropertyChange, ilsimplement
il. Belle réponse bien.Vous souhaitez utiliser une propriété pour ce faire, ainsi que la mise en œuvre de
INotifyPropertyChanged
de sorte que lelabel
's le contenu est mis à jour lors de la modification de la propriété.Voici un exemple en utilisant un simple
ViewModel
xaml:
xaml.cs:
MainViewModel.cs:
Remarque: Idéalement, vous souhaitez utiliser un
Command
pour laButton
à la place d'un gestionnaire d'événements ClickSi vous souhaitez que les modifications apportées à votre propriété sera repris par de l'INTERFACE utilisateur, vous devriez mettre en œuvre
INotifyPropertyChanged
de l'interface et de soulever des événement chaque fois la valeur de la propriété change. DoncidCounter
devrait ressembler à ceci:Lorsque vous créez de liaison à la propriété que vous utilisez
Path
Liaison fonctionne en contexte de liaison de sorte que vous besoin de spécifier où prendre ce
Path
. La plus simple façon de le faire est de fixerDataContext
. Si dans votre cas, l'initialisation doit ressembler à ceci:Comme @d.moncada a suggéré dans sa réponse, vous devez créer dédié au modèle de vue