C# Datetimepicker数据绑定自定义类型

C# Datetimepicker数据绑定自定义类型,c#,winforms,data-binding,datetimepicker,C#,Winforms,Data Binding,Datetimepicker,目前,我有一个自定义日期类,用于存储一年中的日期和年份: public class CustomDate { public short Day { get; set; } public short Year { get; set; } public CustomDate(short day, short year) { this.Day = day; this.Year = year; } } 这可以在类中使用: pu

目前,我有一个自定义日期类,用于存储一年中的日期和年份:

public class CustomDate
{
    public short Day { get; set; }

    public short Year { get; set; }

    public CustomDate(short day, short year)
    {
        this.Day = day;
        this.Year = year;
    }
}
这可以在类中使用:

public class Foo
{
    public int Id { get; set; }

    public CustomDate MyDate { get; set; }
}
到目前为止一切都很好。现在,如果要将其绑定到winform DateTimePicker控件,我将执行以下操作:

    private void BuildDob()
    {
        var bind = new Binding("Value", this._foo, "MyDate", true, DataSourceUpdateMode.OnPropertyChanged);
        bind.Parse += (s, e) =>
            {
                e.Value = new CustomDate(
                    day: (short)((DateTime)e.Value).DayOfYear,
                    year: (short)((DateTime)e.Value).Year);
            };
        this.dtPickerDateOfBirth.DataBindings.Add(bind);
就解析和正确设置对象的日期而言,这是正确的。我面临的问题是,当表单加载时,datetimepicker没有将自己显示/设置为正确的绑定日期,它将自己设置为01/01/1900,我猜这是因为我试图绑定到CustomDate,而该类型无法绑定到datetimepicker


有什么解决方案需要绑定到正确的属性,但在加载时设置了正确的日期?

我相信您可以创建一个隐式运算符,将CustomDate类型转换为DateTime,反之亦然:

public class CustomDate
{
    public int Day { get; set; }

    public int Year { get; set; }

    public CustomDate(int day, int year)
    {
        this.Day = day;
        this.Year = year;
    }

    public override string ToString()
    {
        return Year + "/" + Day;
    }

    public static implicit operator CustomDate(DateTime _dt) => new CustomDate(_dt.DayOfYear, _dt.Year);
    public static implicit operator DateTime(CustomDate _dt) => new DateTime(_dt.Year,1,1).AddDays(_dt.Day-1);


}
日属性和年属性是整数而不是短属性,我不明白为什么要改变它


我明白您的意思,但这不会影响绑定:this.dtPickerDateOfBirth.DataBindings.Add(“Value”,this.\u foo,“MyDate”,true,DataSourceUpdateMode.OnPropertyChanged);当控件加载时,它仍然是1900年1月1日RegardLessorry,我将删除答案。。。是否可以自定义DateTimePicker控件?如果为DateTime创建第二个属性,如
public DateTime Date{get=>MyDate;set=>MyDate=value;}
(在答案中使用隐式操作符)