2016-10-30 2 views
0

Je sais que c'est un problème terriblement commun, mais je ne peux pas obtenir le bouton pour mettre à jour le contenu "Pressed1" et "Pressed2" lors du changement de "Default" de buttonContent. Après avoir examiné quelques questions, je ne peux pas trouver la réponse que je travaillerais pour moi, je ne peux tout simplement pas à trouver ce qui ne va pas ici, voici donc le code merdique:WPF Databinding, la valeur ne sera pas mise à jour

La fenêtre avec un bouton

public partial class MainWindow : Window 
{ 
    Code_Behind cB; 
    public MainWindow() 
    { 
     cB = new Code_Behind(); 
     this.DataContext = cB; 
     InitializeComponent(); 
    } 
    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     cB.buttonPressed(); 
    } 
} 

Et voici la classe séparée

public class Code_Behind : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _buttonContent = "Default"; 
    public string buttonContent 
    { 
     get { return _buttonContent; } 
     set { 
       if (_buttonContent != value) 
        { 
         buttonContent = value; 
         OnPropertyChanged("buttonContent"); 
        } 
      } 
    } 
    public void buttonPressed() 
    { 
     int timesPressed = 0; 
     if (timesPressed != 1) 
     { 
       _buttonContent = "Pressed1"; 
       timesPressed++; 
     } 
     else if (timesPressed != 2) 
     { 
       _buttonContent = "Pressed2"; 
       timesPressed++; 
       timesPressed = 0; 
     } 
    } 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 
} 

Répondre

0

Vous ne définissez pas la propriété, mais le champ de support. Par conséquent, l'événement PropertyChanged n'est pas déclenché.

Remplacer

_buttonContent = "Pressed1"; 
... 
_buttonContent = "Pressed2"; 

avec

buttonContent = "Pressed1"; 
... 
buttonContent = "Pressed2"; 

En outre, il est une convention largement acceptée pour écrire les noms de propriété avec boîtier Pascal, à savoir ButtonContent au lieu de buttonContent. De plus, votre accesseur de propriété a l'air bizarre (probablement parce que vous essayez de compresser trop de code sur une seule ligne).

Au lieu de

set 
{ 
    if (_buttonContent != value) 
    { 
     _buttonContent = value; 
    } 
    OnPropertyChanged("buttonContent"); 
} 

il devrait certainement

set 
{ 
    if (_buttonContent != value) 
    { 
     _buttonContent = value; 
     OnPropertyChanged("buttonContent"); 
    } 
} 
+0

Ouais, c'est en fait le problème ici, il semble. Eh bien, il n'a jamais expliqué comment exactement les propriétés ont travaillé en premier lieu. Y a-t-il une différence entre la liaison à une instance d'objet de la classe ou directement à la classe? – Zephylir

+1

La liaison "directement à la classe" signifierait la liaison à une propriété de classe (c'est-à-dire statique)? Commencez à lire ici: [Présentation de la liaison de données] (https://msdn.microsoft.com/en-us/library/ms752347 (v = vs.110) .aspx). – Clemens

+0

Et en passant, ce que vous appelez "classe séparée" (appelé 'Code_Behind') est communément appelé un * modèle de vue * dans le modèle architectural MVVM. – Clemens