2009-08-11 11 views
1

Mehrere (Neuling) Fragen zu verstehen:Versuch INotifyPropertyChanged

1) Ich sehe eine Menge

public Person SelectedPerson { get; set; } 

Ich gehe davon aus das löst nicht eine Eigenschaft ändern?

Also, wenn ich das will, muss ich folgendes bereitstellen?

private Person selectedPerson; 
    public Person SelectedPerson 
    { 
     get 
     { 
      return this.selectedPerson; 
     } 
     set 
     { 
      if ((this.selectedPerson != value)) 
      { 
       this.selectedPerson = value; 
       base.OnPropertyChanged("SelectedPerson"); 
       // Note: Using ViewModelBase 

      } 
     } 
    } 

2) Wenn ich die folgenden Voraussetzungen erfüllt sein:

public bool CanDeletePerson 
    { 
     get 
     { 
      return SelectedPerson != null; 
     } 
    } 

und auch in den XAML

< Button IsEnabled="{Binding CanDeletePerson}" 
Command="{Binding DeletePersonCommand}"> Delete </ Button > 

Wie bekomme ich es die CanDeletePerson Eigenschaft neu zu bewerten? Grundsätzlich ist es zunächst deaktiviert, aber wenn ich auf das Raster und zeilenweise bewegen, die SelectedPerson aktualisiert wird, aber die CanDeletePerson ist nicht der aktualisierte Wert bekommen, so wie bekomme ich es tatsächlich wieder den Wert überprüfen ?

3) Ich sehe

... hängt davon ab, ob etwas auf das Ereignis abonniert hat

Wie Sie auf das Ereignis abonnieren?

Antwort

3
  1. Richtig - die nicht abfeuert
  2. Ja, CanDeletePerson neu bewertet haben, können Sie Property erhöhen auf CanDeletePerson, wie so

    set 
        { 
         if ((this.selectedPerson != value)) 
         { 
          this.selectedPerson = value; 
          base.OnPropertyChanged("SelectedPerson"); 
          base.OnPropertyChanged("CanDeletePerson"); 
         } 
        } 
    
  3. Wie jedes normales Ereignis, aber wenn Sie WPF verwenden, Sie in der Regel müssen abonnieren nicht explizit

+0

+1 Sie kamen später, aber ich mochte die Organisation Ihrer Antwort. –

+0

siehe http://stackoverflow.com/questions/1329138/how-to-make-databinding-type-safe-and-support-refactoring/1333874#1333874 für einen Compiler überprüft Weg der Implementierung von INotifyPropertyChanged. –

2

Ja, Auto Eigenschaften nicht Feuer das PropertyChanged Ereignis.

Sie können die CanDeletePerson neu auswerten, indem Sie OnPropertyChanged("CanDeletePerson") zum SelectedPerson Setter hinzufügen.

Ich bin mir nicht sicher, ob Ihre letzte Bit eine Frage ist, aber Sie können wie jedes andere Ereignis der Property Ereignis abonnieren. MyClass.PropertyChanged += MyClassPropertyChanged

Wo MyClassPropertyChanged

private void MyClassPropertyChanged(object sender, PropertyChangedEventArgs args) 
{ 
    args.PropertyName .... //<-- Name of property changed. 
} 

, aber Sie sollten nicht brauchen. WPF abonniert das Ereignis, das benötigt wird.

+0

+1 Sie haben mich geschlagen. – statenjason

1

Here's ein Link zu einem guten Artikel, der das MVVM-Muster einführt.Wenn Sie sich die RelayCommand-Klasse ansehen, können Sie ein ICommand-Objekt implementieren und ein Prädikat angeben, um zu beurteilen, ob der Befehl ausgeführt werden kann oder nicht.

Die Auswertung des Prädikats canExecute im RelayCommand erspart Ihnen das Binden einer separaten Eigenschaft an die IsEnabled-Eigenschaft des Buttons.

Ich folge normalerweise dem Beispiel in dem Artikel der Implementierung einer privaten Eigenschaft, die den booleschen Wert für das Prädikat canExecute liefert.

Dieser Artikel war eine gute Hilfe für mich, um mit dem Muster zu beginnen.

0

Wenn Sie das PropertyChanged-Ereignis verwenden, muss Ihre Klasse die INotifyProperyChanged-Schnittstelle implementieren und das Ereignis bei Bedarf auslösen. In WPF ist der Standardwert für die Datenbindung die DependencyProperty. Wenn Sie also mit dem PropertyChanged-Ereignis arbeiten, müssen Sie etwas in XAML tun (vorausgesetzt, Ihre Klassenperson verfügt über eine Name-Eigenschaft, bei der Sie das PropertyChanged-Ereignis auslösen):

<TextBlock Text={Binding Path=Name, UpdateSourceTrigger=PropertyChanged} /> 
Verwandte Themen