2013-10-01 20 views
7

Próbuję użyć nowego DateTimePicker dla Windows 8.1:DateTimePicker wiążące kwestie

<DatePicker HorizontalAlignment="Left" Margin="401,245,0,0" Grid.Row="1" 
VerticalAlignment="Top" Width="352" Date="{Binding personSingle.personDOB,Mode=TwoWay}"/> 

Gdy kiedykolwiek zmienić datę nie uzyskać wartość, że wybrałem, kiedy patrzę na wartość dla personDOB. personDOB jest typu DateTimeOffset

Co muszę zrobić, aby uzyskać wybraną przeze mnie wartość?

Aktualizacja:

<DatePicker x:Name="dtPick" HorizontalAlignment="Left" Margin="401,245,0,0" Grid.Row="1" 
VerticalAlignment="Top" Width="352" DataContext="{Binding personSingle}" 
Date="{Binding personSingle.personDOB.Date,Mode=TwoWay}"/> 
+0

Czy ustawić "DataContext"? – Xyroid

+0

@ Xyroid - tak, zrobiłem to. – webdad3

+0

Sprawdź, czy datakiet danych jest pusty lub nie. – Xyroid

Odpowiedz

12

Znalazłem odpowiedź z tego linku:

http://bretstateham.com/binding-to-the-new-xaml-datepicker-and-timepicker-controls-to-the-same-datetime-value/

Musisz napisać konwerter aby uzyskać to do pracy odpowiednio:

public class DateTimeToDateTimeOffsetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     try 
     { 
      DateTime date = (DateTime)value; 
      return new DateTimeOffset(date); 
     } 
     catch (Exception ex) 
     { 
      return DateTimeOffset.MinValue; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     try 
     { 
      DateTimeOffset dto = (DateTimeOffset)value; 
      return dto.DateTime; 
     } 
     catch (Exception ex) 
     { 
      return DateTime.MinValue; 
     } 
    } 
} 
+0

Nigdy nie używaj try/catch w logicznym przepływie! Zastąp go if/else. W tym przypadku 'if (value is DateTime) {...} else {...}' –

1

Jak to było wyjaśnić d do mnie, lepiej jest rzucić wyjątek podczas konwersji, a następnie użyć domyślnego.

public class DateTimeToDateTimeOffsetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return new DateTimeOffset((DateTime)value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return ((DateTimeOffset)value).DateTime; 
    } 
}