2010-06-18 17 views
6

Me parece estar teniendo problemas serios conseguir mi WPF interfaz de usuario para actualizar cuando actualizo cuando actualice la propiedad que está obligado a. Este es mi punto de vista la clase del modelo:WPF Encuadernación con INotifyPropertyChanged no actualiza

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); 
      } 
     } 
    }; 
} 

Esto se ve obligada a mi sencilla interfaz de usuario en el siguiente 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> 

La aplicación se define como sigue:

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) 
     { 
     } 
    } 
} 

Cuando el la aplicación se inicia, todo es color de rosa, la etiqueta incluso muestra inicialmente cualquier valor que esté en la propiedad Count del modelo. El incremento de llamadas actualiza el modelo de manera adecuada y el incremento directo de la propiedad Count como se muestra en el código también funciona bien.

El problema aquí, es que el controlador de eventos PropertyChanged no parece que se añade a. Puedo recorrer el código en el depurador y ver el valor de la actualización propiedad, y puedo ver la llamada a OnPropertyChanged aún, pero el propio manejador PropertyChanged siempre es nula.

¿Hay un problema con mi vinculante tal vez?

estoy usando MSVC 2010 Express.

+0

Su manejador IncButton_Click está actualmente vacía en su ejemplo; ¿se ha asegurado de llamar a Increment en AppModel en su DataContext y no en alguna otra instancia de AppModel? –

Respuesta

8

La cuestión es que el WpfModel que tiene como una variable de instancia, _model, es no la misma instancia que está siendo utilizado como DataContext de la ventana. Por lo tanto, no está obligado por nada, y PropertyChanged siempre será nulo.

Cambiar la XAML para establecer el DataContext a esto:

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

Deshacerse de la variable de instancia declarada en el código detrás, y fijar la implementación OnPropertyChanged (utilizar el parámetro en lugar de la cadena literal "apuntalar"), y funciona.

5

esta línea:

var e = new PropertyChangedEventArgs("prop"); 

debería ser:

var e = new PropertyChangedEventArgs(prop); 

Está pasando la cadena "apuntalar" por lo que los datos enviados escucha de "Count" no se dispara.

** EDIT ** Según sus otros comentarios (¿Respuesta?) Pensé que era mejor actualizar esto con una solución; podría usar la respuesta ya dada pero no quiero copiar a otra persona :).

Agregue esto a su controlador de clic:

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

Usted cometió el mismo error en su "arreglo" - debe dejar las cotizaciones aquí, también;) –

+0

ejem., Es posible que desee verificar su código – zendar

+0

Haha - Copiar y pegar - gracias muchachos –

Cuestiones relacionadas