2009-02-20 5 views
5

Ok, Also bin ich in meinem letzten Nicht-Arbeitsprojekt ins Stocken geraten, versuche WPF zu benutzen. Ich bin einfach verärgert über Datenbindung. Ich dachte, es sollte Dinge einfacher machen, indem man Daten direkt an die Benutzeroberfläche bindet. Aber je mehr ich darüber lerne, dass ich INotifyPropertyChanged implementieren muss, um Dinge zu veranlassen, die Benutzeroberfläche zu benachrichtigen, wenn sie sich geändert haben, scheint die ganze Sache produktiv zu machen.Macht WPF Databinding mehr Mühe, als es wert ist?

Fehle ich etwas? Es scheint ein Haufen Arbeit zu sein, und die Klassen INotifyPropertyChanged implementieren zu lassen scheint eine fischige Art zu sein, Databinding zum Laufen zu bringen.

Was fehlt mir? Ich muss etwas verpassen. Bitte erläutern Sie mir, wie man Databinding einfach oder zumindest einfach macht.

Antwort

4

Wenn Sie möchten, dass die Benutzeroberfläche benachrichtigt wird, wenn sich die zugrunde liegende Datenquelle ändert, benötigen Sie einige Art von Benachrichtigungsmechanismus. Für WPF ist INotifyPropertyChanged dieser Mechanismus.

Es ist das gleiche in Windows Forms, aber Windows Forms unterstützt auch den alten Benachrichtigungsmechanismus, wo Sie ein Ereignis mit dem Namen <Property>Changed haben.

Allerdings erforderte keiner dieser Mechanismen diese Mechanismen, wenn Sie nur einmal an die Daten binden und diese anzeigen möchten.

Wenn Sie keine Benachrichtigungen erhalten, dann binden Sie einfach an die Datenquelle und es funktioniert.

+0

Also jedes Mal, wenn sich eine Eigenschaft einer Klasse ändert, müssen wir das PropertyChanged-Ereignis auslösen? Das scheint langweilig. Was, wenn wir nicht einmal den Code für die Klasse haben, an die wir binden wollen? Wird das nicht unordentlich? –

+0

GordonG, hier ist das Model-View-ViewModel-Muster sehr zu empfehlen. Ihr ViewModel (mittlere Ebene) behandelt dies im Wesentlichen, indem es Ihnen ermöglicht, die zugrunde liegenden Model-Eigenschaften, aber Ihre View-Databinds an die wiederbelichteten Eigenschaften des ViewModels (NICHT die des Modells!) Erneut zu exponieren. – Adrian

+0

(Fortsetzung von oben) Ihr ViewModel implementiert INotifyPropertyChanged und für 'Get'-Aufrufe geben Sie nur den Wert des zugrundeliegenden Modells pro Eigenschaft zurück, aber bei' set'-Aufrufen legen Sie den Eigenschaftswert des zugrunde liegenden Modells fest und feuern PropertyChanged, so dass die Ansicht angezeigt wird der aktualisierte Wert – Adrian

4

Um ehrlich zu sein, ich habe nicht gesehen, dass es so schlecht war, und halte es für eine sehr praktikable Lösung.

dieses einfache Nehmen Data Model-Objekt:

Public Class SimpleItemViewModel 
Implements INotifyPropertyChanged 

Private _item As String 
Public Property Item As String 
    Get 
     return _item 
    End Get 
    Set (value as string) 
     _item = value : OnPropertyChanged("Item") 
    End Set 
End Property 

Protected Overridable Sub OnPropertyChanged(propChange as string) 
    Raise Event PropertChanged(me, new PropertyChangedEventArgs(propChange)) 
End Sub 
Public Event PropertyChanged(sender as object, e as PropertyChangedEventArgs) 
End Class 

, die leicht zu einem einfachen Textbox über gebunden ist:

<Textbox Text="{Binding Item}" /> 

zusätzlich, wenn ich eine DIRTY Flagge haben wollte kann ich leicht Setzen Sie das Flag, das in der OnPropertyChanged-Untergruppe gesetzt wird, und bestimmen Sie leicht, ob ich irgendwelche Benutzeränderungen speichern muss oder nicht.

Ich fand es am einfachsten, eine Reihe von Klassen zu haben, die zwischen der Datenzugriffsschicht und der UI liegen, die dieses Zeug enthält. Sie können sogar Ihre Business Logic und DAL diese Klassen anstelle der atomaren Werte weitergeben.

+0

Denken Sie daran, dass der obige Text = "{Binding Item}" aufgrund der Idee eines geerbten Datenkontextes funktioniert. Der Datenkontext Ihrer View ist das ViewModel. – Adrian

+0

Die obige Syntax ist ausführlich, aber Sie können PropertyChanged-Ereignisse nach Belieben auslösen. Sie können mehrere solcher Ereignisse auslösen, wenn Sie einen Wert festlegen (möglicherweise ändern die anderen Eigenschaften, die sich ändern, nur Getter, weil sie berechnete Eigenschaften sind). – Adrian

+0

KP - Genau. Wenn Sie über Untersteuerelemente oder sogar Container verfügen, können Sie dem Datenkontext des Containers über das Programm zusätzliche Ansichtsmodelle zuweisen. –

0

DataBinding ist die einzige Möglichkeit zum Implementieren eines Modellansichtsmusters in WPF/Silverlight. Ihre Modelle können UI-dumm sein, indem Sie INotifyPropertyChanged implementieren, wodurch sie von der Benutzeroberfläche isoliert werden. Es speichert auch eine Menge von UI-Code beim Stuffing von Informationen in der Benutzeroberfläche.

Ein weiterer Vorteil, den ich genieße, ist die Möglichkeit, untergeordnete Steuerelemente mit denselben Daten weiter zu binden, indem Sie die Verknüpfung {Binding} verwenden.

0

Erstens ist INotifyPropertyChanged nicht die einzige Möglichkeit, um eine Datenbindung an Arbeitseigenschaften zu erhalten.

Zweitens kann INotifyPropertyChanged mit nur einer Codezeile in Ihrer Entitätsklasse implementiert werden, wenn Sie AOP verwenden - Sie müssen nicht alle diese Benachrichtigungsanrufe selbst durchführen.

Insgesamt würde ich sagen, Datenbindung ist ein großer Segen, vor allem, wenn Sie Code-Generierung, um automatisch gebundene Steuerelemente aus einigen Datenquellen zu machen.

2

Implementieren INotifyProperty geändert ist nicht besonders schwierig, da es nur ein Mitglied hat.

Wenn Sie keine Änderungen im zugrunde liegenden Objekt erwarten, dann machen Sie sich keine Sorgen über INotifyProperty geändert, und verwenden Sie eine Bindung mit Mode=OneTime.

Wenn sich das zugrunde liegende Objekt ändern kann und Sie möchten, dass die GUI diese Änderungen widerspiegelt, wie kann dies sonst ohne die Art von Benachrichtigung erreicht werden, die INotifyProperty geändert hat? Es ist nicht vernünftig zu erwarten, dass ein gebundenes Objekt die Quelle seiner Bindung abfragt.

Persönlich habe ich festgestellt, dass WPF einige Zeit in Anspruch genommen hat, aber jetzt, wo ich Trost bekomme, finde ich es unglaublich mächtig und angenehm zu arbeiten. Ich ermutige jeden, der WPF herausfordert, dabei zu bleiben.

0

Wenn Sie nach einer guten Möglichkeit suchen, über die Strukturierung Ihrer Datenbindung nachzudenken, sollten Sie einen DataContext nur einmal auf Ihren logischen Baum setzen und anschließend die verschiedenen Bereiche Ihrer Benutzeroberfläche mit verbindlichen Pfaden füllen.

0

Seien Sie so deklarativ wie Sie in Ihrer Bindung. Lassen Sie das Vorlagensystem seinen Job machen und verwenden Sie stark DataTemplate s, die explizite DataType s angeben.

1

Die Bindung in XAML ist ziemlich einfach, dynamische WPF-Datenbindung im Code ist jedoch schmerzhaft und verwirrend.

+0

So ist es doch nicht ich! –