C# 是否可以覆盖DependencyProperty以更改它';s类型和添加转换器?

C# 是否可以覆盖DependencyProperty以更改它';s类型和添加转换器?,c#,wpf,datepicker,dependency-properties,C#,Wpf,Datepicker,Dependency Properties,我的模型将日期存储为DateTimeOffset。我想创建一个从DatePicker继承并重写SelectedDate属性的控件。我希望该属性是DateTimeOffset而不是DateTime,并且我希望在该自定义控件内处理从一种类型到另一种类型的转换 我知道可以使用DateTimeOffset的SelectedDate属性创建一个UserControl,将DatePicker放入该控件中,并将其SelectedDate绑定到新的SelectedDate,然后在那里使用转换器。但我希望避免这种

我的模型将日期存储为DateTimeOffset。我想创建一个从DatePicker继承并重写SelectedDate属性的控件。我希望该属性是DateTimeOffset而不是DateTime,并且我希望在该自定义控件内处理从一种类型到另一种类型的转换


我知道可以使用DateTimeOffset的SelectedDate属性创建一个UserControl,将DatePicker放入该控件中,并将其SelectedDate绑定到新的SelectedDate,然后在那里使用转换器。但我希望避免这种情况,因为这需要我重新实现DatePicker的其他属性,我可能需要在将来使用这些属性。

是的,可以覆盖该属性并将其转换为其他类型,但解决方案有点棘手。问题是,如果隐藏原始的SelectedDate,则新的SelectedDate不会成为更改的日期,反之亦然

这是您的控件:

using System;
using System.Windows;
using System.Windows.Controls;

public class OffsetedDatePicker : DatePicker
{
    public new DateTimeOffset? SelectedDate
    {
        get { return (DateTimeOffset)GetValue(SelectedDateOffProperty); }
        set { SetValue(SelectedDateOffProperty, value); }
    }

    public static readonly DependencyProperty SelectedDateOffProperty =
        DependencyProperty.Register(nameof(SelectedDate), typeof(DateTimeOffset?), typeof(OffsetedDatePicker), new PropertyMetadata(null, SelectedDateOffChanged));

    private static void SelectedDateOffChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var odp = d as OffsetedDatePicker;
        if (odp==null) { return; }          
        (d as DatePicker).SelectedDate = odp.SelectedDate.HasValue ? odp.SelectedDate.Value.Date : (DateTime?)null;
    }

    public OffsetedDatePicker()
    {
        SelectedDateChanged += OffsetedDatePicker_SelectedDateChanged;
    }

    private void OffsetedDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {
        DateTime? newDate = null;
        if (e.AddedItems.Count > 0)
        {
            newDate = (DateTime)e.AddedItems[0];
        }
        SetValue(SelectedDateOffProperty, newDate.HasValue ? new DateTimeOffset(newDate.Value) : (DateTimeOffset?)null);
    }
}
XAML:

<local:OffsetedDatePicker SelectedDate="{Binding Path=YourVMDateTimeOffsetProp, Mode=TwoWay}" />


您试过什么吗?您可以使用
new
关键字声明另一个SelectedDate属性。虽然设计可能很糟糕……但您可以对DP使用
对象
类型并使用
强制值回调
。将绑定与转换器一起使用有什么问题?不需要编写自定义用户控件就可以使用binding+converter…Clemens,您不能用new关键字隐藏DP,因为绑定不是通过直接访问属性来完成的@AnjumSKhan,我已经尝试重写SelectedDate属性的元数据并处理强制ValueCallback,但在此之前绑定失败,我得到的值为null。elgonzo,我想避免需要强制转换器的逻辑。否则,每个开发人员都必须记住,您不能只将DatePicker绑定到模型,而必须使用converter。@NickSologoub,啊,所以您希望与其他人共享该控件。我假设您希望从DatePicker派生以保持其UI相关功能。在这种情况下,我建议如下:从DatePicker派生控件,但保持SelectedDate属性不变。引入两个新属性,一个用于DateTimeOffset,另一个用于日期偏移的原点。每当SelectedDate或DateTimeOffset发生更改时,请在原点的帮助下计算其他属性。(1/2)