web-dev-qa-db-fra.com

WPF: liaison de données simple 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 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. Aussi, si la chaîne Name2 est mis à jour périodiquement à l'aide de TimerCallback, dois-je faire quelque chose pour m'assurer que la zone de texte est mise à jour lorsque les données changent?

50
Warpin

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

public string Name2 { get; set; }

Soyez averti qu'avec cette implémentation minimale, votre TextBox ne répondra pas aux modifications de programmation apportées à Name2. Donc, 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 cela dans un objet de données séparé plutôt que dans votre classe Window.

75
itowlson

Votre fenêtre n'implémente pas les notifications de liaison de données nécessaires requises par la grille pour l'utiliser comme source de données, à savoir l'interface INotifyPropertyChanged .

Votre chaîne "Nom2" 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.

L'implémentation des interfaces nécessaires à l'utilisation d'un objet en tant que source de données peut être trouvée ici .

7
Darien Ford

Juste pour les besoins futurs.

Dans Visual Studio 2013 avec .NET Framework 4.5, essayez d’ajouter ElementName=window pour le faire fonctionner.

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