58 votes

WPF : liaison de données simple pour les TextBox

J'ai cette classe :

public partial class Window1 : Window
{
    public String Name2;

    public Window1()
    {
        InitializeComponent();
        Name2 = new String('a', 5);
        myGrid.DataContext = this;
    }

    // ...
}

Et je veux afficher la chaîne de caractères Name2 dans la zone de texte.

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2}"/>
</Grid>

Mais la chaîne n'est pas affichée. De même, si la chaîne de caractères Name2 est mis à jour périodiquement à l'aide d'un TimerCallback Dois-je faire quelque chose pour m'assurer que la zone de texte est mise à jour lorsque les données changent ?

3 votes

À titre d'astuce, vous pouvez formater le code en l'indentant de quatre espaces ou en utilisant le bouton 101010 - ce qui évite de devoir manipuler les balises br et les crochets d'angle !

90voto

itowlson Points 44174

Nom2 est un champ. WPF se lie uniquement aux propriétés. Changez-le en :

public string Name2 { get; set; }

Attention, avec cette implémentation minimale, votre TextBox ne répondra pas aux changements programmatiques de Name2. Ainsi, pour votre scénario de mise à jour par minuterie, vous devrez implémenter INotifyPropertyChanged :

partial class Window1 : Window, INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected void OnPropertyChanged(string propertyName)
  {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }

  private string _name2;

  public string Name2
  {
    get { return _name2; }
    set
    {
      if (value != _name2)
      {
         _name2 = value;
         OnPropertyChanged("Name2");
      }
    }
  }
}

Vous devriez envisager de déplacer cet élément vers un objet de données distinct plutôt que dans votre classe Window.

0 votes

Exemple tiré de MSDN sur la mise en œuvre de l'interface INotifyPropertyChanged (faites défiler vers le bas jusqu'à la mise en œuvre de DemoCustomer) : msdn.microsoft.com/fr/us/library/

0 votes

En suivant votre exemple, je fais <TextBox Text="{Binding Path=Name2}"/> <Label Content="{Binding Path=Name2}"></Label> Mais cela ne fonctionne pas.

9voto

Stefan Cantacuz Points 11

Juste pour les besoins futurs.

Dans Visual Studio 2013 avec .NET Framework 4.5, pour une propriété de fenêtre, essayez d'ajouter ElementName=window pour que ça marche.

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2, ElementName=window}"/>
</Grid>

8voto

Darien Ford Points 878

Votre fenêtre ne met pas en œuvre les notifications de liaison de données nécessaires dont la grille a besoin pour l'utiliser comme source de données, à savoir la fonction INotifyPropertyChanged interface.

Votre chaîne "Name2" doit également être une propriété et non une variable publique, car la liaison de données doit être utilisée avec des propriétés.

Les interfaces nécessaires à l'utilisation d'un objet comme source de données peuvent être implémentées ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X