2012-06-22 13 views
8

Ich frage mich, wie entscheiden Sie wann converters verwenden und wann triggers verwenden. Ich bevorzuge die Verwendung von Triggern für Operationen auf der GUI (wie das Ein-/Ausblenden von Steuerelementen, Ändern der Darstellung usw.).Sollte ich WPF-Konverter oder Trigger verwenden?

Vor einiger Zeit habe ich ein BooleanToVisibilityConverter für diesen Zweck aber jetzt, ich brauche es einfach nicht, ich alle an die visibility verbunden Dinge einen Trigger verwenden und ich sogar angefangen zu denken "was war der Zweck der Schaffung a BooleanToVisibilityConverter vom MS-Team? ". Im Allgemeinen, wenn es möglich ist, versuche ich eine deklarative Weise zu verwenden, um den Code zu schreiben - in diesem Beispiel - XAML.

Was ist deine Meinung dazu?

+0

Trigger werden für Einzelwertprüfung verwendet, wo Konverter für komplexe und andere Art der Wertumwandlung verwendet wird. – JSJ

+0

Ähnliche Fragen Hinweis auf die Leistung Kosten von Konvertern - http://stackoverflow.com/questions/5508159/datatrigger-vs-databinding-with-converter-performance-wise – akjoshi

Antwort

13

Ich stimme dir zu, ich versuche auch, deklarativen Code in XAML zu verwenden und Triggers statt Converters vorzuziehen.

In den meisten Szenarien können Trigger die gleiche Arbeit wie jeder Konverter ausführen, aber Converters kann benutzerdefinierte/Business-Logik als pchajer erwähnt haben.

Eine Einschränkung von Triggers ist, dass Setter in Ihrem DataTriggers nur Eigenschaften Ihrer UI-Elemente ändern können; so, Sie können Ihre ViewModels-Eigenschaft mit Triggern nicht aktualisieren, das ist, wo Converters gewinnen, erinnern Sie sich an die ConvertBack Methode.

So Sie können Ihre VM Eigenschaft mit Kontrollen binden VisibilityBooleanToVisibilityConverter verwenden und auch wenn Ihre Kontrollen visibility von einem anderen geändert wird, bedeutet, dass Ihre VM Eigenschaft aktualisiert werden; im Allgemeinen ist es nicht erforderlich, deshalb BooleanToVisibilityConverter wird durch Trigger ersetzt.

So kurz -

Triggers nur OneWay Operationen durchführen kann, während ConvertersTwoWay Operationen

+1

es ist * lustig * wie diese Antwort ist fast genau das gleiche wie [ diese andere] (http://Stackoverflow.com/a/19474466/540776) – superjos

+0

@superjos Ich würde sagen, "wie andere Antwort ist fast genau das gleiche wie diese": D Danke für das darauf hin, machte mich lächeln :) – akjoshi

+1

Ja, um bei dem Thema zu bleiben, kopiere ich einfach meinen Kommentar hierher und dort :) – superjos

1

Sie die Funktionalität entweder durch Trigger oder Wandler erreichen können, aber aus meiner Option unten Möglichkeit in Betracht gezogen werden, während Entscheidung unter

  1. Wenn Sie für die Entwicklung TDD Ansatz verwenden, dann für Konverter gehen, wie Sie Testfälle schreiben .
  2. Wenn es irgendeine Geschäftslogik gibt, die besser ist, um im Konverter und etwas zu kodieren, die durch Auslöser nicht erreicht werden können.
1

Neben durchführen kann, was gesagt wurde über ich nur hinzufügen:

  • Auslöser manchmal erfordern doppelte Dinge, z.B. Wenn Sie mehr als eine Eigenschaft für Trigger haben, müssen Sie jede für jede Kombination angeben
  • Manchmal benötigen Sie Code, um richtig von Typ A nach B zu konvertieren, dann müssen Sie Konverter verwenden. Trigger sind gut, wenn der Wert/die Eigenschaft bereits in der VM verfügbar ist und Sie ihn für Trigger verwenden können.
2

Meiner Meinung nach schauen Sie von unten nach oben und Sie müssen nur von oben nach unten schauen.

Trigger -Wenn eine bestimmte Bedingung erfüllt ist „löst“ eine Ausführungs

Wandler -Convert zwischen zwei inkompatible Typen.

Warum brauchen wir einen booleschen Datentyp, wenn wir die gleiche Funktionalität mit intergers machen können?

0

Sie sollten geschäftsbezogene Vorgänge immer in den DomainModel-Objekten oder zumindest in einem ViewModel-Objekt ausführen. Einige geschäftliche Arbeit in Konverter ist keine gute Option, da Konverter einen Wert von einem Typ in einen anderen konvertieren sollen.

+0

Dida du siehst meine Frage? Ich habe explizit geschrieben: "Für Operationen auf GUI (wie Anzeigen/Verbergen von Steuerelementen, Ändern ihrer Darstellung usw.)". Ich weiß, dass geschäftliche Optionen auf dem DomainModel-Objekt gesteuert werden müssen. –

Verwandte Themen