2011-08-07 2 views
1

J'essaye d'implémenter la liaison de données, et d'avoir le texte de TextBox à mettre à jour une fois que je clique sur un bouton.Liaison de données dans WPF sur le bouton cliquez sur

XAML:

<TextBox Text="{Binding Path=Output}" /> 

code:

public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = Search; 
     Search.Output = "111"; 
    } 

    public SearchClass Search = new SearchClass(); 


    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     Search.Output = "222"; 
    } 

    public class SearchClass 
    { 
     string _output; 

     public string Output 
     { 
      get { return _output; } 
      set { _output = value; } 
     } 
    } 

Lorsque j'exécute le programme, je vois "111", de sorte que la liaison de MainWindow() fonctionne, mais si je clique sur un bouton - le texte dans le TextBox n'est pas mis à jour (mais dans le débogueur je vois que button1_Click est exécuté et Search.Output est maintenant égal à "222"). Qu'est-ce que je fais mal?

Répondre

3

Vous devez mettre en œuvre INotifyPropertyChanged dans votre SearchClass puis en setter déclencher l'événement:

public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
public string Output 
{ 
    get { return _output; } 
    set 
    { 
     _output = value; 
     PropertyChanged(this, new PropertyChangedEventArgs("Output")); 
    } 
} 

Si je comprends bien, SearchClass est le DataContext pour votre TextBlock. Dans ce cas, la mise en œuvre comme ci-dessus aiderait.

Lorsque WPF voit une classe comme source de liaison - il essaie de la convertir en INotifyPropertyChanged et de s'abonner à l'événement PropertyChanged. Et lorsque l'événement est déclenché - WPF met à jour la liaison associée à l'expéditeur (premier argument de PropertyChanged). C'est le mécanisme principal qui rend le travail de liaison si facilement.

1

Vous devez implémenter l'interface INotifyPropertyChanged sur votre classe SearchClass. C'est ainsi que les valeurs des liants sont notifiées, leurs valeurs de source ont changé. Il affiche la valeur "111" car il n'a pas encore été mis en page (plus ou moins), mais ne le mettra pas à jour tant que vous n'aurez pas implémenté cette interface.

Questions connexes