WPF ValueConverter - Standardrückgabe für nicht konvertierbaren Wert
Im Laufe des letzten Jahres oder so habe ich gesehen, viele unterschiedliche Wert-Wandler für viele verschiedene Zwecke, von vielen verschiedenen Autoren. Eine Sache, die Stöcke in meinem Kopf ist die Breite Varianz der 'default' - Werte, die zurückgegeben werden. Zum Beispiel;
public class MyConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//OK, we test for some undesirable, unconvertable situation, typically null...
if (value == null)
{
//And here are a variety of 'defaults' that I have seen, these begin the most typical.
return null;
return DependencyProperty.UnsetValue;
return Binding.DoNothing;
}
//...... other code.. whatever...
}}
Also meine Frage ist, gibt es eine "standard" - Weg, um zu zeigen, dass ein input-Wert nicht konvertiert werden kann?
InformationsquelleAutor der Frage A.R. | 2011-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut MSDN - IValueConverter:
Den key line Griff zu erwartenden Probleme durch Rücksendung DependencyProperty.UnsetValue.
InformationsquelleAutor der Antwort m-y
Wenn man sich diese Werte an, bis Sie finden Sie heraus, was Sie bedeuten. Wähle dann die richtigen zu finden, zurück in Ihre Wandler.
Das Hauptproblem ist, dass null sein könnte, ein Gültiger Wert für die Eigenschaft.
DependencyProperty.UnsetValue , um anzugeben, dass die Eigenschaft vorhanden ist, aber nicht über Ihren Wert von der property-system
Die Bindung.DoNothing zu beauftragen, verbindliche Motor nicht die übertragung von einem Wert zu dem verbindlichen Ziel, sich nicht zu bewegen auf die nächste Bindung PriorityBinding, oder nicht, um die FallBackValue oder default-Wert
BEARBEITEN
Zu zeigen, dass Sie können nicht konvertieren Sie den Wert sollten Sie einfach den vorgegebenen Wert. Das ist das beste was Sie tun können, denn es gibt das problem an den Autor der Bindung. Wenn du dich mit dem Wert wird es sehr schwer, findout, was Los ist.
InformationsquelleAutor der Antwort Erno de Weerd
Nachdem viel denken und Graben um, es scheint, dass DependencyProperty.UnsetValue ist die richtige Wahl. Ich zog alles im Haus über diese Muster mit viel Erfolg. Auch der text im Feld "Anmerkungen" Abschnitt auf dieser Seite zeigt an, dass ich dies ist wahrscheinlich die beste Wahl..
Gibt es auch einige Diskussionen über die Rückkehr der input-Wert, wenn eine Bindung kann nicht umgewandelt werden, dies kann aber leicht zu "brechen" das Bindungs-system. Denken Sie an einen Fall, wo die Bindung input " ist ein 'string' und die Ausgabe ist ein "Pinsel". Rückgabe eines string ist nicht zur Arbeit gehen!
InformationsquelleAutor der Antwort A.R.
was Sie wieder als Standard kommt auf die situation an. Sie wollen nicht zurück einen int als Standardwert für einen Konverter zu einem bool oder Rückgabe ein boolescher Wert, der für einen Konverter für die visibility-enum.
InformationsquelleAutor der Antwort Muad'Dib
In der Regel, wenn ein Wert nicht konvertiert werden kann, werfe ich ein
Exception
Dies ist, weil, wenn ich versuche, zu konvertieren einen Wert ein Ungültiger Konverter, ich würde gerne benachrichtigt werden, damit ich verändern kann meinen code.
In einigen seltenen Fällen, kann ein Wert gültig sein, auch wenn es nicht umgewandelt werden kann, und in diesem Fall ich in der Regel den gleichen Wert zurückgeben, die übergeben wurde, um die Konverter. Dies wird nur verwendet, wenn ich möchte, den Wert konvertiert werden, wenn möglich, oder bleiben die gleichen, wenn nicht.
Einem anderen seltenen Fall, dass ich getan habe, gelegentlich ist hardcoding einen default-Wert. Dies geschieht in der Regel, wenn ich weiß, der Konverter kann verwendet werden, mit einem ungültigen parameter, und ich möchte, um wieder eine gültigen Wert, egal was das Ergebnis ist. Meine hard-codierte Standard-Wandler fast immer, geben Boolesche Werte.
Ich glaube nicht, dass ich jemals wieder den 3, die Sie angegeben (
null
,DependencyProperty.UnsetValue
oderBinding.DoNothing
), denn diese Werte sind oft unerwartete und nicht leicht zu bemerken, wenn Sie gezielt nach Ihnen suchen.InformationsquelleAutor der Antwort Rachel
Könnte man auch wieder einen echten
targetType
Standard-Objekt durch die Verwendung dieser Funktion:Quelle: C# - Programm durchführen(default-Typ)
InformationsquelleAutor der Antwort SuperOli