WPF:绑定到自定义结构

时间:2013-04-16 06:46:30

标签: wpf data-binding

我创建了自定义结构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");
     }
 }

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

1 个答案:

答案 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}}"/>