Frage

Ich mag DatePicker die folgenden Textstücke konvertieren DateTime (im internationalen Format gezeigt), so meine Kunden können ein Datum in DatePicker Textbox schreiben schneller, so ist es nicht nur DateTime.Parse ich verwenden:

"3" to 2009-10-03
"14" to 2009-10-14
"1403" to 2009-03-14
"140310" to 2010-03-14
"14032010" to 2010-03-14

Ich habe verschiedene Methoden versucht, es zu tun, aber sie funktionieren nicht. Ich habe versucht, DatePicker.Text / DatePicker.SelectedDate / DatePicker.DisplayDate mit einem benutzerdefinierten Valueconverter zu binden. Aber es funktioniert nicht, weil DatePicker bereits bearbeitet hat den Text, bevor ich auf den Text zu bekommen.

Ich habe auch versucht, in dem DatePicker TextBox.LostFocus so zu konvertieren:

public class CustomDatePicker : DatePicker
{
    private DatePickerTextBox textBox;

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        textBox = this.GetTemplateChild("TextBox") as DatePickerTextBox;

        if (textBox != null)
            textBox.LostFocus += textBox_LostFocus;
    }

    void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        if (textBox == null) return;

        DateTime result;

        // This is my method for converting my special cases, 
        // parses d, dd, mm, ddmm, ddmmyy, ddmmyyyy
        if (textBox.Text.TryParseShortcut(out result)) 
        {
            // I have also tried with 
            // this.SelectedDate/DisplayDate = result;
            textBox.Text = result.ToString("dd/MM/yyyy"); 
            return;
        }

        if (DateTime.TryParse(textBox.Text, out result))
        {
            // I have also tried with 
            // this.SelectedDate/DisplayDate = result;
            textBox.Text = result.ToString("dd/MM/yyyy");
            return; 
        }
    }
}

Irgendwelche Ideen?

War es hilfreich?

Lösung

Wenn Sie Bindung verwenden, um Daten zu Ihrem Datepicker zu binden, könnten Sie eine Valueconverter verwenden.

Schnell Beispiel Datum Konverter:

public class CustomDateValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string)
        {
            string dateValue = (string)value;
            switch (dateValue.Length)
            {
                case 1:
                case 2:
                    return new DateTime(DateTime.Now.Year, DateTime.Now.Month, System.Convert.ToInt32(dateValue)).ToString("dd/MM/yyyy");
                //...
            }
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // here you should implement your logic to convert your value back.

        return value;
    }
}

DatePickerTextBox Steuerung in XAML:

<controls:DatePickerTextBox Text="{Binding Path=Data, Mode=TwoWay, Converter={StaticResource CustomDateValueConverter}}" />

DatePickerTextBox in cs:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
        DataContext = new MyData() { Data = "3" };

        _textBox.LostFocus += (se, ea) =>
            {
                _textBox.DataContext = 
                    new MyData() { Data = _textBox.Text };
            };
}

public class MyData
{
    public string Data { get; set; }
}

Ich habe gerade eine Klasse MyData genannt, wie Daten in dieser Probe zu verwenden.

Andere Tipps

Ich glaube, Sie brauchen könnten, um tatsächlich beginnen die volle Kontrolle Quelle und anpassen. Das Problem ist, dass der Text in dem Textchanged-Ereignisse aktualisiert wird:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    if (this._textBox != null)
    {
        this.SetValueNoCallback(TextProperty, this._textBox.Text);
    }
}

Also von der Zeit Sie Ihren Fokus verloren Code zu bekommen, hat sich der Wert bereits eingestellt worden. Ich war in der Lage, um dieses mit Subclassing zu bekommen, aber da Textchanged jede Änderung Greift Ich bin nicht sicher, dass Ihre Parse-Methode funktioniert (Da, sobald Sie 1 Nummer getroffen wird es zu einem Datum geändert werden).

public class CustomDatePicker : DatePicker
{
    private TextBox textBox; 

    public override void OnApplyTemplate() 
    { 
        base.OnApplyTemplate(); 
        textBox = this.GetTemplateChild("TextBox") as TextBox; 

        if (textBox != null)
            textBox.TextChanged += textBox_TextChanged;
    }

    void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {  
        if (textBox.Text == "now")             
        {                
            // I have also tried with 
            // this.SelectedDate/DisplayDate = result;                
            textBox.Text = DateTime.Now.ToShortDateString();                 
        }  
    }
}

Es funktioniert für mich, da ändert sich nichts, bis er das ganze Wort buchstabiert, aber in Ihrem Fall, dass wahrscheinlich nicht funktionieren wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top