2010-06-18 15 views
6

Wygląda na to, że mam poważny problem z aktualizowaniem mojego interfejsu użytkownika WPF, gdy aktualizuję aktualizację właściwości, do której jest ona przypisana. Oto mój widok model klasy definicja:Powiązanie WPF z INotifyPropertyChanged nie aktualizuje się

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

ta jest związana z moim prostym interfejsie użytkownika w poniższym 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> 

Aplikacja jest zdefiniowana jak następuje:

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

Kiedy aplikacja uruchamia się, wszystko jest brzoskwiniowe, etykieta nawet początkowo wyświetla dowolną wartość w właściwości Count modelu. Wywołanie inkrementacji aktualizuje model poprawnie, a bezpośrednio zwiększając właściwość Count, jak pokazano w kodzie, również działa dobrze.

Problem polega na tym, że zdarzenie obsługi zdarzenia PropertyChanged nigdy nie wydaje się być dodawane. Mogę przejść przez kod w debugerze i zobaczyć wartość w aktualizacji właściwości, a ja widzę wywołanie OnPropertyChanged nawet, ale procedura obsługi PropertyChanged sama ma zawsze wartość null.

Czy jest jakiś problem z moim powiązaniem?

Używam MSVC 2010 Express.

+0

Twoja instrukcja obsługi IncButton_Click jest obecnie pusta w twoim przykładzie; czy upewniłeś się, że wywołujesz inkrementację w AppModelu w swoim DataContext, a nie w jakiejś innej instancji AppModel? –

Odpowiedz

8

Kwestia jest taka, że ​​WpfModel masz jako zmiennej instancji, _model jest nie ta sama instancja który jest używany jako okno na DataContext. W związku z tym nie jest on związany przez nic, a jego właściwość PropertyChanged zawsze będzie miała wartość NULL.

Zmień XAML do ustawiania datacontext do tego:

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

pozbyć zmiennej instancji zadeklarowanego w kodzie tyłu i naprawić OnPropertyChanged realizacji (użyj parametru zamiast dosłownego string „prop”) i działa.

5

ta linia:

var e = new PropertyChangedEventArgs("prop"); 

powinno być:

var e = new PropertyChangedEventArgs(prop); 

są przechodzącą ciąg "prop" więc wartości bound słuchania dla "Count" nie zostanie uruchomiony.

** EDIT ** Na podstawie twoich pozostałych komentarzy (Odpowiedź?) Pomyślałem, że lepiej zaktualizuję to za pomocą poprawki - możesz użyć odpowiedzi już podanej, oczywiście, ale nie chcę skopiować kogoś innego :).

Dodaj to do swojej click obsługi:

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

Zrobiłeś ten sam błąd w swojej "naprawie" - musisz też pominąć tutaj cytaty;) –

+0

ahem, możesz sprawdzić swój kod – zendar

+0

Haha - Skopiuj i wklej - dziękuję chłopaki –

Powiązane problemy