2017-05-04 4 views
1

내 모델의 날짜가 DateTimeOffset으로 저장되어 있습니다. DatePicker에서 상속 받고 SelectedDate 속성을 재정의하는 컨트롤을 만들고 싶습니다. 그 속성은 DateTime 대신 DateTimeOffset이되고 싶습니다. 한 유형에서 다른 유형으로의 변환을 처리하고 싶습니다.DependencyProperty를 재정의하여 형식을 변경하고 변환기를 추가 할 수 있습니까?

DateTimeOffset의 SelectedDate 속성을 사용하여 UserControl을 만들고 DatePicker를 해당 컨트롤 안에 넣은 다음 SelectedDate를 새로운 SelectedDate에 바인딩하고 거기서 변환기를 사용할 수 있음을 알고 있습니다. 그러나 나는 그것을 피하고 싶습니다. 앞으로 사용해야 할 DatePicker의 다른 속성을 다시 구현해야 할 필요가 있습니다.

+0

당신은 아무것도를 시도 여기

은 당신의 통제인가? 'new' 키워드를 사용하여 다른 SelectedDate 속성을 선언 할 수 있습니다. 아마 나쁜 디자인 일지라도 ... – Clemens

+0

DP에'object' 유형을 사용하고'CoerceValueCallback'을 사용할 수 있습니다. – AnjumSKhan

+0

변환기와의 바인딩을 사용하는 것이 잘못된 이유는 무엇입니까? 바인딩 + 변환기를 사용하기 위해 사용자 정의 사용자 정의 컨트롤을 작성할 필요가 없습니다. – elgonzo

답변

1

예, 속성을 재정의하고 다른 유형으로 변환하는 것이 가능하지만 해결책은 조금 까다 롭습니다. 문제는 원래 SelectedDate를 숨기면 새로운 것이 변경되지 않으며 그 반대도 마찬가지입니다.

using System; 
using System.Windows; 
using System.Windows.Controls; 

public class OffsetedDatePicker : DatePicker 
{ 
    public new DateTimeOffset? SelectedDate 
    { 
     get { return (DateTimeOffset)GetValue(SelectedDateOffProperty); } 
     set { SetValue(SelectedDateOffProperty, value); } 
    } 

    public static readonly DependencyProperty SelectedDateOffProperty = 
     DependencyProperty.Register(nameof(SelectedDate), typeof(DateTimeOffset?), typeof(OffsetedDatePicker), new PropertyMetadata(null, SelectedDateOffChanged)); 

    private static void SelectedDateOffChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var odp = d as OffsetedDatePicker; 
     if (odp==null) { return; }   
     (d as DatePicker).SelectedDate = odp.SelectedDate.HasValue ? odp.SelectedDate.Value.Date : (DateTime?)null; 
    } 

    public OffsetedDatePicker() 
    { 
     SelectedDateChanged += OffsetedDatePicker_SelectedDateChanged; 
    } 

    private void OffsetedDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
     DateTime? newDate = null; 
     if (e.AddedItems.Count > 0) 
     { 
      newDate = (DateTime)e.AddedItems[0]; 
     } 
     SetValue(SelectedDateOffProperty, newDate.HasValue ? new DateTimeOffset(newDate.Value) : (DateTimeOffset?)null); 
    } 
} 

가 XAML :

<local:OffsetedDatePicker SelectedDate="{Binding Path=YourVMDateTimeOffsetProp, Mode=TwoWay}" />