2013-04-16 50 views
3

我已經創建自定義的結構Date內部使用DateTime,但它是從存儲當前日期時間,可以防止:WPF:綁定到一個自定義的結構

public struct Date 
    { 
     private readonly DateTime _dateTime; 
     public Date(int year, int month, int day) 
     { 
      _dateTime = new DateTime(year, month, day, 0, 0, 0, DateTimeKind.Utc); 
     } 
     public override string ToString() 
     { 
      return _dateTime.ToString(); 
     } 
     public static Date Parse(string input) 
     { 
      return new Date(DateTime.Parse(input)); 
     } 
     //other class members 
    } 

這種解決方案對我很好,但我被困時我想從用戶那裏拿Date。當我這種類型的結合的DatePicker我不能設置或綁定屬性得到值:

<DatePicker SelectedDate="{Binding Date}"/> 

物業:

public Date Date 
{ 
    get { return _date; } 
    set 
    { 
     _date = value; 
     OnPropertyChanged("Date"); 
    } 
} 

是否存在有「綁定自定義結構」一些聰明的方法是什麼?

回答

3

這不會奏效,導致DatePicker控件的屬性SelectedDate的類型爲Nullable<DateTime>,並且運行時不能將Date結構隱式轉換爲DateTime結構。

你可以做的是實現一個IValueConverter將日期時間轉換爲你的日期結構。

對我來說,我不會用我自己的結構來表示日期值。如果您只對Date值感興趣,則應將您的財產更改爲DateTime並使用DateTime的Date財產。

public DateTime Date 
{ 
    get { return _date; } 
    set 
    { 
     _date = value.Date; 
     OnPropertyChanged("Date"); 
    } 
} 

如果你想保持你的時間結構,然後使用的IValueConverter,您分配給您的結合日期轉換爲日期時間,反之亦然。

public class DateToDateTimeConverter : IValueConverter{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     // convert Date to DateTime 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     //convert DateTime to Date 
    } 

    } 

XAML:

<DatePicker SelectedDate="{Binding Date, Converter={StaticResource dateToDateTimeConverter}}"/> 
+0

推出自訂'Date'是解決與時區的問題,我不想回來DateTime.Date ... –

+0

@MiłoszWierzbicki從來就更新我的答案 – Jehof

+0

@MiłoszWierzbick你有沒有看過'DateTimeOffset' insted的'DateTime'? – ventiseis