我创建了自定义结构Date
,它在内部使用DateTime
,但它阻止了存储当前时间:
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时,我无法在binded属性中设置或获取值:
<DatePicker SelectedDate="{Binding Date}"/>
财产:
public Date Date
{
get { return _date; }
set
{
_date = value;
OnPropertyChanged("Date");
}
}
是否有一些聪明的方法来拥有“可绑定的自定义结构”?
答案 0 :(得分:3)
这不起作用,因为DatePicker控件的属性SelectedDate的类型为Nullable<DateTime>
,并且运行时无法将Date结构隐式转换为DateTime结构。
您可以做的是实现IValueConverter
将DateTime转换为Date结构。
对我来说,我不会使用自己的结构来表示Date值。如果您只对Date值感兴趣,则应将属性更改为DateTime并使用DateTime的Date属性。
public DateTime Date
{
get { return _date; }
set
{
_date = value.Date;
OnPropertyChanged("Date");
}
}
如果你想保留你的Date结构,那么使用你分配给绑定的IValueConverter将Date转换为DateTime,反之亦然。
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}}"/>