실버 라이트 데이트 피커 (Silverlight DatePicker)의 텍스트에서 dateTime으로 변환됩니다
-
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;
}
}
}
어떤 아이디어?
해결책
바인딩을 사용하여 DatePicker에 데이터를 바인딩하는 경우 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;
}
}
XAML의 DatePickerTextBox Control :
<controls:DatePickerTextBox Text="{Binding Path=Data, Mode=TwoWay, Converter={StaticResource CustomDateValueConverter}}" />
CS의 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);
}
}
따라서 분실 한 초점 코드에 도달 할 때 값이 이미 설정되었습니다. 서브 클래싱을 사용 하여이 문제를 해결할 수 있었지만 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();
}
}
}
그것은 전체 단어를 철자 할 때까지 아무것도 바뀌지 않기 때문에 나에게 효과적이지만, 당신의 경우에는 작동하지 않을 것입니다.