WPF: liaison de données de zone de texte simple

, 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. En outre, si la chaîne Name2 est mise à 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?

45
demandé sur lelimacon 2009-11-13 00:30:11

3 réponses

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 zone de texte ne répondra pas aux modifications programmatiques de Name2. Donc, pour votre scénario de mise à jour de la minuterie, vous devrez implémenter INotifyPropertyChanged:

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

  // usual OnPropertyChanged implementation

  private string _name2;

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

Vous devriez envisager de déplacer ceci vers un objet de données distinct plutôt que sur votre classe Window.

68
répondu itowlson 2009-11-12 21:44:57

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

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

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

5
répondu Darien Ford 2009-11-12 21:44:08

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 le faire fonctionner.

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2, ElementName=window}"/>
</Grid>
5
répondu Stefan Cantacuz 2015-06-11 16:41:34