2009-04-22 5 views
1

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 
     } 
    } 

Antwort

0

Vielen Dank an Josh G - mit seiner Hilfe habe ich die (oder zumindest eine) Antwort gefunden.

Dies war für ein Textfeld in einem DatePicker-Steuerelement, das ich erstelle. Also anstatt „sperren“ das Textfeld direkt auf den Wert der Kontrolle, habe ich eine Zwischeneigenschaft, die dann den Satz auf die Abhängigkeitseigenschaft ruft:

public DateTime? DateValue 
    { 
     get 
     { 
      return _dateValue; 
     } 
     set 
     { 
      _dateValue = value; 
      OnPropertyChanged("DateValue"); 
      SetValue(ValueProperty, _dateValue); 
     } 
    } 

und das funktioniert ganz wie es sollte. Nochmals vielen Dank, Josh!

3

Ist es möglich, dass die Trägerdateneigenschaft nur PropertyChanged Brennen, wenn es tatsächlich Wert ändert? Sie können versuchen, PropertyChanged abzufeuern, wenn die set-Funktion aufgerufen wird, unabhängig davon, ob sich der Wert ändert. Dies würde dazu führen, dass die Bindung aktualisiert wird.

+0

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! –

+0

Entschuldigung, ich habe nicht erkannt, dass Sie eine Abhängigkeitseigenschaft für die Quelle verwenden. Das macht diese Antwort irrelevant. –

Verwandte Themen