اعتراض سيلفرلايت منتقي التاريخ لتحويل من النص إلى التاريخ والوقت

StackOverflow https://stackoverflow.com/questions/1601481

سؤال

وأريد DatePicker لتحويل القطع النص التالي إلى DateTime (كما هو موضح في الشكل الدولي) بحيث يمكن للعملاء بلدي إرسال تاريخ في مربع النص DatePicker أسرع حتى لا يكون مجرد DateTime.Parse سأستخدم:

"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

ولقد حاولت وسائل مختلفة للقيام بذلك لكنها لا تعمل. لقد حاولت أن تربط DatePicker.Text / DatePicker.SelectedDate / DatePicker.DisplayDate مع valueconverter المخصصة. لكنها لا تعمل بسبب DatePicker بالفعل معالجة النص قبل أن أحصل على النص.

ولقد حاولت أيضا لتحويل في DatePicker TextBox.LostFocus مثل هذا:

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

وأي أفكار؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم ملزم لربط البيانات إلى منتقي التاريخ الخاص بك، هل يمكن استخدام ValueConverter.

ومثال سريع لتحويل تاريخ:

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 في XAML:

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

وDatePickerTextBox في خدمات العملاء:

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

ولقد أدلى به للتو فئة تسمى MyData لاستخدام البيانات كما في هذه العينة.

نصائح أخرى

وأعتقد أنك قد تحتاج إلى البدء في الواقع فإن مصدر التحكم الكامل وتخصيص ذلك. هو أن النص يحصل على تحديث مشكلة في الحدث TextChanged:

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

وهكذا في الوقت الذي تحصل على التعليمات البرمجية فقدان التركيز، وقد تم بالفعل تعيين القيمة. وكنت قادرا على الحصول على حول هذا إن شاء subclasses ترث استخدام، ولكن منذ TextChanged يتعامل مع كل تغيير لست متأكد من طريقة تحليل العمل الخاص بك (منذ بمجرد ضرب 1 عدد أنها سوف تحصل على تغير إلى التاريخ).

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();                 
        }  
    }
}

وكان يعمل بالنسبة لي منذ لا شيء يتغير حتى نوبات الكلمة بالكامل، ولكن في حالتك التي ربما لن ينجح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top