2016-03-24 10 views
1

Hallo :) Ich versuche herauszufinden, wie die INotifyPropertyChanged mit einer sehr grundlegenden Anwendung arbeiten. Ich habe einfach eine Schaltfläche in meinem Hauptfenster und wenn Sie es drücken, sollte ein Ereignis ausgelöst werden, um eine TextBox zu aktualisieren, die an ein bestimmtes Attribut gebunden wurde. Auch wenn die Ereignisse ausgelöst werden, sind sie immer null und daher wird die textBox nicht aktualisiert.INotifyPropertyChanged, Ereignis immer null

<Window x:Class="StockViewer.MainWindow" 
    <!--Just erased some basic xaml here--> 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <local:RandomGen/> 
</Window.DataContext> 

<Grid> 
    <Button Click="incr" Height="30" VerticalAlignment="Top" Background="DarkGoldenrod"></Button> 
    <TextBlock VerticalAlignment="Top" Margin="40" Text="{Binding price, UpdateSourceTrigger=PropertyChanged}" Background="Aqua"></TextBlock> 
</Grid> 

Wenn die Taste gedrückt wird, sollte der Preis ändern:

public partial class MainWindow : Window 
{ 
    private RandomGen gen; 
    public MainWindow() 
    { 
     gen = new RandomGen();   
     InitializeComponent(); 
    } 
    private void incr(object sender, RoutedEventArgs e) 
    { 
     gen.price = 7; 
    } 
} 

class RandomGen : NotifiedImp 
    { 
    public RandomGen() 
     { 
      _i = 3; 
     } 
     private int _i; 

     public int price 
     { 
      get { return _i; } 
      set 
      { 
       _i = value; 
       OnPropertyChanged("price"); 
      } 
     } 
    } 

class NotifiedImp: INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged;   
     protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this,new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

Es ist nur wirklich seltsam, der Handler immer null ist. Danke :)

+0

Sie sind nicht an "gen" gebunden. –

Antwort

2

Sie haben zwei Instanzen von RandomGen, eine in XAML initialisiert:

<Window.DataContext> 
    <local:RandomGen/> 
</Window.DataContext> 

Und ein anderer in Ihrem MainWindow Konstruktor initialisiert:

gen = new RandomGen(); 

Das bedeutet, wenn Sie gen.price = 7; aktualisieren Sie aktualisieren nicht die Instanz, die Ihre DataContext ist.

Eine Lösung wäre, entfernen Sie Ihre <Window.DataContext> Einstellung in XAML und setzte DataContext in Ihrem MainWindow Konstruktor, etwa so:

public MainWindow() 
{ 
    gen = new RandomGen();   
    InitializeComponent(); 
    DataContext = gen; 
} 

Die MVVM ähnliche Lösung ein ICommand auf Ihrem RandomGen Objekt zu verwenden, wäre price zu aktualisieren anstatt einen Ereignishandler verwenden, dann diesen Befehl in XAML verwenden, wie:

<Button Command="{Binding IncrementPriceCommand}"></Button> 

dann ist es an Ihnen, wie Sie initialisiere DataContext, du müsstest das RandomGen Unterstützungsfeld nicht in beiden Richtungen behalten.