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 値のみに関心がある場合は、プロパティを 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 に答える