2010-06-18 26 views
6

Sembra che si stiano riscontrando seri problemi durante l'aggiornamento della mia UI WPF quando aggiorno quando aggiorno la proprietà a cui è associato. Qui è la mia vista definizione della classe del modello:Il binding WPF con INotifyPropertyChanged non viene aggiornato

namespace WpfModel 
    { 
     class AppModel : INotifyPropertyChanged 
     { 
      private int _count = 7; 

     public int Count { get { return _count; } 
     set { _count = value;  OnPropertyChanged("Count"); } } 

     public void Increment() 
     { 
      Count++; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string prop) 
     { 
      PropertyChangedEventHandler handler = this.PropertyChanged; 

      if (handler != null) 
      { 
       var e = new PropertyChangedEventArgs("prop"); 
       handler(this, e); 
      } 
     } 
    }; 
} 

Questo è destinato al mio semplice interfaccia utente nel seguente XAML:

<Window x:Class="WpfModel.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:WpfModel" 
     Title="WPF Data Model Demo" Height="128" Width="284" > 

    <Window.DataContext> 
     <vm:AppModel /> 
    </Window.DataContext> 

    <Grid Height="Auto" Width="Auto"> 
     <Button Margin="0,0,12,12" Name="IncButton" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="IncButton_Click" Content="Increment" /> 
     <Label Content="Count Variable:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" /> 
     <Label Height="28" Margin="116,12,0,0" Name="CountLabel" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Content="{Binding Path=Count}" /> 
    </Grid> 
</Window> 

L'applicazione è definito come segue:

namespace WpfModel 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private AppModel _model = new AppModel(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      //_model = new AppModel(); 
     } 

     private void IncButton_Click(object sender, RoutedEventArgs e) 
     { 
     } 
    } 
} 

Quando il l'app si avvia, tutto è peachy, l'etichetta mostra anche inizialmente qualsiasi valore si trovi nella proprietà Count del modello. Chiamare l'aggiornamento aggiorna correttamente il modello e anche l'incremento diretto della proprietà Count come mostrato nel codice funziona perfettamente.

Il problema qui è che il gestore di eventi PropertyChanged non sembra mai essere aggiunto. Posso scorrere il codice nel debugger e vedere il valore nell'aggiornamento della proprietà, e posso vedere anche la chiamata a OnPropertyChanged, ma il gestore PropertyChanged è sempre nullo.

C'è un problema con il mio binding forse?

Sto utilizzando MSVC 2010 Express.

+0

Il gestore IncButton_Click è attualmente vuoto nell'esempio; ti sei assicurato di chiamare Increment su AppModel nel tuo DataContext e non qualche altra istanza di AppModel? –

risposta

8

Il problema è che il WpfModel si dispone come una variabile di istanza, _model, è non la stessa istanza che viene utilizzato come DataContext della finestra. Quindi, non è vincolato da nulla, e il suo PropertyChanged sarà sempre nullo.

Cambia la tua XAML per impostare il DataContext a questo:

<Window.DataContext> 
      <vm:AppModel x:Name="_model" /> 
</Window.DataContext> 

Sbarazzarsi della variabile di istanza dichiarata nel codice dietro, e fissare l'attuazione OnPropertyChanged (utilizzare il parametro invece che la stringa letterale "prop"), e funziona.

5

questa linea:

var e = new PropertyChangedEventArgs("prop"); 

dovrebbe essere:

var e = new PropertyChangedEventArgs(prop); 

Si passa la stringa "prop" in modo che i valori legati ascolto per "Count" non verrà attivato.

** MODIFICA ** Sulla base dei tuoi altri commenti (Risposta?) Ho pensato che sarebbe stato meglio aggiornarlo con una correzione - potresti ovviamente usare la risposta già data ma non voglio copiare qualcun altro :).

Aggiungi questo al vostro gestore clic:

((AppModel)this.DataContext).Count += 1; 
+1

Hai fatto lo stesso errore nella tua "correzione" - devi anche lasciare le virgolette;) –

+0

ahem, potresti voler controllare il tuo codice – zendar

+0

Haha - Copia e incolla - grazie ragazzi –

Problemi correlati