실버 라이트 데이트 피커 (Silverlight DatePicker)의 텍스트에서 dateTime으로 변환됩니다

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

어떤 아이디어?

도움이 되었습니까?

해결책

바인딩을 사용하여 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();                 
        }  
    }
}

그것은 전체 단어를 철자 할 때까지 아무것도 바뀌지 않기 때문에 나에게 효과적이지만, 당신의 경우에는 작동하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top