Ich implementiere einen benutzerdefinierten Datumskonverter in WPF, die Idee, schlauer über Datumseingabe, a la Outlook (in der Lage sein, "heute" eingeben, etc.) Also habe ich meinen eigenen Konverter geschrieben, der funktioniert . Es formatiert den Benutzereintrag im Format M/d/yy. Wenn sie zum Beispiel 8-2 eingeben, sehen sie den 2.8.09. Schön.Forcing Convert wird immer ausgeführt, wenn ein benutzerdefinierter Konverter in WPF verwendet wird?
Die Frage ist: Es gibt mehrere Dinge, die der Benutzer eingeben kann, die schließlich zum selben Datum führen. (8-2 und 8/2, einfache Beispiele). Sagen wir also, sie beginnen mit der Eingabe von 8/2, das durch ConvertBack und Convert läuft und als 8/2/09 angezeigt wird. So weit, ist es gut. Nehmen wir an, sie geben 8-2 (oder 8/2 wieder) in dasselbe Feld ein, gleich danach. Das wird durch ConvertBack ausgeführt, das das gleiche Datum liefert, das bereits in der gebundenen Eigenschaft vorhanden ist, so dass es nicht störend ist, Convert auszuführen, was bedeutet, dass "8/2" dort in der Textbox sitzt. Yick! Es gibt kein Datenproblem, nur eine Anzeige, aber hey, Sauberkeit zählt.
Wie kann ich WPF zwingen, Convert nach ALL (kein Fehler) Einträge auszuführen?
Hier ist eine vereinfachte Version des Konverters:
public class DateConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
string tempStr = value.ToString();
return ((DateTime.Parse(tempStr)).ToString("M/d/yy"));
}
else
{
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return DateTime.Parse(value.ToString());
}
#endregion
}
und hier ist es, was die Verwendung von es aussieht:
<local:FilteredTextBox.Text>
<Binding Path="Value" ElementName="root" Converter="{StaticResource DateConv}"
UpdateSourceTrigger="LostFocus" Mode="TwoWay" diagnostics:PresentationTraceSources.TraceLevel="High"
NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<local:DateValidation/>
</Binding.ValidationRules>
</Binding>
</local:FilteredTextBox.Text>
Dank! Scott
Als Reaktion auf einen Kommentar unten, hier ist der Träger Eigenschaft:
public DateTime? Value
{
get
{
return (DateTime?)GetValue(ValueProperty);
}
set
{
SetValue(ValueProperty, value);
OnPropertyChanged(new DependencyPropertyChangedEventArgs(ValueProperty, null, value)); // I just added this line, it makes no difference
}
}
In diesem Fall legt die Hintergrunddateneigenschaft immer den Wert einer DependencyProperty (dies wird in einem benutzerdefinierten Steuerelement verwendet) mithilfe von SetValue fest. Ich habe den obigen Code hinzugefügt. Und um sicher zu gehen, habe ich OnPropertyChanged auch danach aufgerufen - keine Änderung! Ratten! –
Entschuldigung, ich habe nicht erkannt, dass Sie eine Abhängigkeitseigenschaft für die Quelle verwenden. Das macht diese Antwort irrelevant. –