2013-02-07 2 views
0

DatePicker 클래스를 파생하여 사용자가 DateMode (일, 월, 연도)에 따라 컨트롤을 사용할 수 있도록하는 추가 DateMode 속성을 지원합니다. 따라서 DateMode를 Year로 설정하면 해당 컨트롤이 더 자세히 드릴 다운 될 수 없으므로 해당 연도의 달과 그 이후의 달을 볼 수 있습니다. 컨트롤이 정상적으로 작동하지만 문제가 하나 있습니다. DatePicker 컨트롤에서 포커스를 잃는 즉시 FormatMod에 따라 서식을 변경하는 'PART_TextBox'컨트롤에 문자열 서식을 적용했지만 서식이 손실됩니다. 다음은 내 파생 된 DatePicker 컨트롤 코드입니다.DatePicker SelectedDate 문자열 형식

public class MyDatePicker : DatePicker 
{ 
    public string DateMode 
    { 
     get { return (string)GetValue(DateModeProperty); } 
     set { SetValue(DateModeProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for DateMode. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DateModeProperty = 
     DependencyProperty.Register("DateMode", typeof(string), typeof(MyDatePicker), new UIPropertyMetadata("Day")); 

    protected override void OnCalendarOpened(RoutedEventArgs e) 
    { 
     var popup = this.Template.FindName("PART_Popup", this) as Popup; 
     var tb = this.Template.FindName("PART_TextBox", this) as TextBox; 

     if (popup != null && popup.Child is System.Windows.Controls.Calendar) 
     { 
      if (DateMode == "Year") 
       ((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Decade; 
      else if (DateMode == "Month") 
       ((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Year; 
      else if (DateMode == "Day") 
       ((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Month; 
     } 
     ((System.Windows.Controls.Calendar)popup.Child).DisplayModeChanged += new EventHandler<CalendarModeChangedEventArgs>(DatePickerCo_DisplayModeChanged); 
    } 

    protected override void OnCalendarClosed(RoutedEventArgs e) 
    { 
     base.OnCalendarClosed(e); 
     IsDropDownOpen = false; 
     var popup = this.Template.FindName("PART_Popup", this) as Popup; 
     ((System.Windows.Controls.Calendar)popup.Child).DisplayModeChanged -= new EventHandler<CalendarModeChangedEventArgs>(DatePickerCo_DisplayModeChanged); 
    } 

    private void DatePickerCo_DisplayModeChanged(object sender, CalendarModeChangedEventArgs e) 
    { 
     var popup = this.Template.FindName("PART_Popup", this) as Popup; 
     var tb = this.Template.FindName("PART_TextBox", this) as TextBox; 

     if (popup != null && popup.Child is System.Windows.Controls.Calendar) 
     { 
      var _calendar = popup.Child as System.Windows.Controls.Calendar; 

      if (DateMode == "Month" && _calendar.DisplayMode == CalendarMode.Month) 
      { 
       if (IsDropDownOpen) 
       { 
        this.SelectedDate = _calendar.DisplayDate; 
        this.IsDropDownOpen = false; 
        _calendar.DisplayMode = CalendarMode.Year; 
       } 
       tb.Text = this.SelectedDate.Value.ToString("MMM yyyy"); 
      } 
      else if (DateMode == "Year" && _calendar.DisplayMode == CalendarMode.Year) 
      { 
       if (IsDropDownOpen) 
       { 
        this.SelectedDate = _calendar.DisplayDate; 
        this.IsDropDownOpen = false; 
        _calendar.DisplayMode = CalendarMode.Decade; 
       } 
       tb.Text = this.SelectedDate.Value.ToString("yyyy"); 
      } 
     } 
    } 
} 

답변

0

아마 기본 클래스에 방해가되는 것 같습니다. 나는 정확한 설정을 잘 모르겠지만 PART_TextBoxDatePicker에 의해 설정된 바인딩을 가지고 있으며 아마도 LostFocus를 업데이트하고 직접 설정 한 Text 값을 지우려면 다시 반복한다고 생각합니다. BindingOperations.GetBinding을 사용하여 Text의 바인딩에 액세스하고 Text을 직접 설정하는 대신 StringFormat을 수정 해보십시오.