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:
UriIsValidConverter
! Zu programmieren! UriIsValidAndBoolIsFalseMultiConverter
! Codieren! DirectoryPathToFileList
Converter! FileInfoToBitmap
Konverter! 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
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.
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.
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:
Wenn ich diese Logik in das Ansichtsmodell verschiebe, bekomme ich:
Dieser Ansatz verwendet einen der starken Punkte von WPF, seine verbindlichen Fähigkeiten.
Tags und Links wpf data-binding