2009-06-24 3 views
3

Welchen Zweck hat INotifyPropertyChanged? Ich weiß, dass dieses Ereignis ausgelöst wird, wenn ein Objekt geändert wird, aber wie kann die Ansicht/UI weiß, dass dieses Ereignis ausgelöst wird:INotifyPropertyChanged WPF

Hier ist meine Kundenklasse, die das INotifyPropertyChanged Ereignis implementiert:

public class Customer : INotifyPropertyChanged 
    { 
     private string _firstName; 

     public string LastName { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      if(PropertyChanged != null) 
       PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); 

     } 

     public string FirstName 
     { 
      get { return _firstName; } 

      set 
      { 
       _firstName = value; 
       OnPropertyChanged("FirstName"); 
      } 
     } 
    } 

Aber jetzt, wie um der Benutzeroberfläche mitzuteilen, dass sich die Eigenschaft geändert hat. Wie wenn der Benutzer dem Vornamen null oder leer zuweist, wie kann ich eine MessageBox auf der Benutzeroberfläche anzeigen.

Antwort

3

WPF kann wissen, da es überprüfen kann, ob ein Objekt diese Schnittstelle implementiert, dann das Objekt auf diese Schnittstelle umwandeln und sich für das Ereignis registrieren. Er kann dann die Binding Infrastructure dazu veranlassen, die Anzeige zu aktualisieren. Wenn Sie ebenfalls reagieren möchten, können Sie sich für die gleiche Veranstaltung registrieren.

+0

Ich weiß über das Aktualisieren der Benutzeroberfläche aufgrund der INotifyPropertyChanged-Schnittstelle, aber wie kann ich etwas auf der Benutzeroberfläche basierend auf der Tatsache ändern, dass FirstName null oder leer ist. –

+0

Wenn Sie sich wirklich nicht an das Ereignis anhängen und tun wollen, was Sie in imperativer Weise tun möchten, können Sie es möglicherweise deklarativ tun, durch eine Kombination von z.B. ein Konverter für string -> bool kapselt Ihre Logik und fährt dann eine Sichtbarkeitseigenschaft mit dem resultierenden bool. Ich sehe jedoch nicht, wie eine MessageBox in XAML angezeigt wird. – flq

3

EDIT: Ich lese Ihre Frage und einige Ihrer Kommentare. Hier ist eine mögliche Lösung, die das DataContextChanged-Ereignis und die INotifyPropertyChanged-Schnittstelle für Ihr Customer-Objekt verwendet. Sie sollten auch in WPF und .NET 3.5 in Data Binding Validation suchen.

<TextBox Text="{Binding FirstName}" /> 

// assuming: 
// myWindow.DataContext = new Customer(); 
myWindow.DataContextChanged += MyWindow_DataContextChanged; 

private void MyWindow_DataContextChanged(object sender, 
    DependencyPropertyChangedEventArgs e) 
{ 
    var oldCustomer = e.OldValue as Customer; 
    if (oldCustomer != null) 
    { 
     oldCustomer.PropertyChanged -= Customer_CheckProps; 
    } 

    var newCustomer = e.NewValue as Customer; 
    if (newCustomer != null) 
    { 
     newCustomer.PropertyChanged += Customer_CheckProps; 
    } 
} 

private void Customer_CheckProps(object sender, PropertyChangedEventArgs e) 
{ 
    var customer = sender as Customer; 
    if (customer != null) 
    { 
     if (e.PropertyName == "FirstName" 
      && String.IsNullOrEmpty(customer.FirstName)) 
     { 
      // Display Message Box 
     } 
    } 
} 
5

INotifyPropertyChanged ermöglicht WPF UI-Elemente (über die Standard-Datenbindungsmechanismen) an dem Property Ereignis abonnieren und sie automatisch aktualisieren. Wenn Sie beispielsweise einen TextBlock mit der Eigenschaft FirstName unter Verwendung von INotifyPropertyChanged haben, können Sie ihn in einem Formular anzeigen, und er bleibt automatisch auf dem neuesten Stand, wenn die Eigenschaft FirstName im Code geändert wird.

Die Ansicht abonniert nur die Veranstaltung - die alles Notwendige sagt. Das Ereignis enthält den Namen der geänderten Eigenschaft. Wenn ein Benutzeroberflächenelement an diese Eigenschaft gebunden ist, wird es aktualisiert.