Ist es nur ich oder ist WPF ein Durcheinander von Datenbindung und benutzerdefinierten IValueConvertern?

7

Ernsthaft, es scheint, als würde ich jedes Mal, wenn ich meine UI-Elemente miteinander sprechen lassen will, einen neuen, angepassten IValueConverter schreiben :(. Jemand sagt mir, dass ich es falsch mache, bitte!

Beispiele:

  • Ich wollte, dass eine Schaltfläche nur aktiviert wird, wenn meine Textbox einen gültigen URI enthält. Toll, Zeit, ein UriIsValidConverter ! Zu programmieren!
  • Oh hoppla, ich wollte es auch deaktivieren, während ich etwas verarbeite. Ich denke jetzt muss ich ein UriIsValidAndBoolIsFalseMultiConverter ! Codieren!
  • Ich möchte eine Liste von Dateien in einem bestimmten Verzeichnis (angegeben durch ein Textfeld) in einer Listbox anzeigen. Ich denke, ich brauche einen DirectoryPathToFileList Converter!
  • Oh hey, ich möchte Symbole für jede dieser Dateien in der Listenansicht. Zeit für einen FileInfoToBitmap Konverter!
  • Ich möchte, dass mein Status rot ist, wenn mein Status-String "Error" enthält, ansonsten grün. Yay, ich kann ein StatusStringToSolidColorBrushConverter ! Codieren!

Ich denke wirklich, das ist nicht viel besser als die alte Windows Forms-Methode, bei der einfach alles manuell mit TextChanged events (oder was auch immer) verbunden wird. Was ich denke, ist immer noch eine Option. Ist es das, was die Leute tatsächlich tun, und ich versuche zu sehr, alles in das Databinding-Paradigma einzupassen?

Also ja, bitte sag mir, ob das WPF-Programm wirklich so ist --- oder wenn ich es falsch mache, und wenn ja, was ich tun sollte

    
Domenic 19.07.2009, 15:56
quelle

3 Antworten

10

Ihr Ansatz ist vollkommen gültig (obwohl ich für das zweite Beispiel ein Multibinding anstelle eines solchen spezialisierten Konverters verwenden würde). Wenn Sie jedoch Ihre gesamte Logik in XAML platzieren, erzeugen Sie eine sehr hohe Kopplung zwischen der Art, wie die Anwendung aussieht und die Art, wie es sich verhält, deswegen solltest du vielleicht in das MVVM-Muster schauen, um diese Dinge zu trennen.

Unter dem MVVM-Muster enthält Ihr XAML (die Ansicht) nur sehr einfache Datenbindungen in einem ViewModel, das die gesamte Logik verarbeitet und die Ansicht über die INotifyPropertyChanged-Schnittstelle aktualisiert. Der Code für Ihr drittes Beispiel sieht möglicherweise so aus:

%Vor%

Dabei ist FileViewModel ein anderes Ansichtsmodell, das den Namen und das Symbol für eine Datei enthält.

Der Vorteil dieses Ansatzes besteht darin, dass die ViewModels mit anderen Ansichten und anderen Technologien wie ASP.NET oder WinForms wiederverwendet werden können, sodass Sie nicht in den WPF-Stack eingeschlossen sind. (Auch wenn Sie in einer Umgebung arbeiten, in der es Designer gibt, die für das Aussehen und die Entwickler zuständig sind, die für das Verhalten verantwortlich sind, hilft dies dabei, diese Grenzen zu definieren.)

Am Ende des Tages muss diese Logik jedoch irgendwo hin gehen und während es bessere und schlechtere Wege gibt, um Ihre Anwendung zu erstellen, werden Sie immer noch Code schreiben, der eine Zeichenkette aufnimmt und sie in eine Reihe von Dateinamen und Symbole irgendwo.

    
Martin Harris 19.07.2009, 16:21
quelle
6

Zuerst sollten Sie mit dem Model-View-ViewModel-Muster (MVVM) beginnen. Josh Smith hatte eine fantastische Artikel kürzlich im MSDN Magazine. MVVM und WPF passen perfekt zusammen. Richtig gemacht, Sie werden nicht brauchen IValueConverters so viel . Die Art und Weise, wie Sie vorgehen, verursacht eine sehr enge Verbindung zwischen Ihrer Visualisierung und Ihren Anwendungsaktionen. MVVM wurde entwickelt, um diese Elemente zu entkoppeln.

In diesem Kontext wird Ihr Ansichtsmodell den Status für Sie verfolgen. Ihre Schaltfläche wird aktiviert, wenn die Methode CanExecute aktiviert ist Ein bestimmtes ICommand in Ihrem Ansichtsmodell gibt true zurück. Das gleiche Konzept kann die Deaktivierung der Schaltfläche bei der Verarbeitung von etwas behandeln.

Sie möchten eine Liste von Dateien in einem bestimmten Verzeichnis anzeigen, das in einer Listbox angegeben ist? Haben Sie ein DirectoryViewModel view-Modell, das die Liste der Dateien für die Ansicht bereitstellt, indem es an das Ansichtsmodell bindet. Die Anzeige der Dateien kann mit einer DataTemplate Angabe in XAML angegeben werden ohne Code dahinter. Dasselbe Konzept kann die Bereitstellung der Symbole für die Ansicht übernehmen, deren Anzeige in der Vorlage angegeben werden kann.

Sie möchten, dass Ihr Status rot ist, wenn eine Statusmeldung "Fehler" enthält und ansonsten grün? Lassen Sie ein View-Modell den Status bestimmen und die Ansicht an diesen Status binden. Jetzt benötigen Sie nur noch IStateConverter , um den Status entsprechend rot oder grün zu konvertieren (dies ist eine der vielen Möglichkeiten, dieses Problem im MVVM-Kontext zu lösen). .

Gewöhnen Sie sich an, Daten und Status getrennt von Ihrer Ansicht zu halten, und Ihre Anwendungen sind lose miteinander verbunden, einfacher zu entwickeln und zu warten und einfacher zu testen.

    
jason 19.07.2009 16:29
quelle
5

Weiß nicht, ob du falsch liegst, es einfach viel schwieriger zu machen, als es sein muss!

Ich verwende MVVM. Wenn Sie also Kundenkonverter schreiben, stelle ich eine bindbare Eigenschaft für das Ansichtsmodell bereit, die der Ansicht mitteilt, was zu tun ist. Zum Beispiel:

  1. Um eine Liste von Dateien anzuzeigen, stelle ich eine Sammlung zur Verfügung, die diese Liste enthält.
  2. Wenn ich Icons haben möchte, hat das Objekt in dieser Sammlung eine Icon-Eigenschaft
  3. Wenn ich möchte, dass ein Status rot oder grün ist, stelle ich eine StatusColor-Eigenschaft zur Verfügung.

Wenn ich diese Logik in das Ansichtsmodell verschiebe, bekomme ich:

  1. viel einfacher Xaml.
  2. kann meine Ansichtslogik ohne die Ansicht testen.

Dieser Ansatz verwendet einen der starken Punkte von WPF, seine verbindlichen Fähigkeiten.

    
automatic 19.07.2009 16:45
quelle

Tags und Links