3

我创建了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 时,我无法在绑定属性中设置或获取值:

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

财产:

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

有没有一些聪明的方法来拥有“可绑定的自定义结构”?

4

1 回答 1

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}}"/>
于 2013-04-16T06:51:45.737 回答