اعتراض سيلفرلايت منتقي التاريخ لتحويل من النص إلى التاريخ والوقت
-
05-07-2019 - |
سؤال
وأريد 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();
}
}
}
وكان يعمل بالنسبة لي منذ لا شيء يتغير حتى نوبات الكلمة بالكامل، ولكن في حالتك التي ربما لن ينجح.