DependencyObject 日期时间格式更改

DependencyObject DateTime Format Change

我正在使用自定义日期选择器,我正在尝试通过依赖项 属性 更改日期格式以仅显示年份。经过一些实验后,我得到了一个 Nullable object must have a value 异常。我正在使用以下代码:

 public bool YearOnly
    {
        get { return (bool)this.GetValue(YearOnlyProperty); }
        set { this.SetValue(YearOnlyProperty, value); }
    }

    public static readonly DependencyProperty YearOnlyProperty =
        DependencyProperty.Register("YearOnly",
        typeof(bool),
        typeof(CustomizableDatePicker),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnYearOnlyChanged)));

    private static void OnYearOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CustomizableDatePicker control = (CustomizableDatePicker)d;
        control.SelectedDate = Convert.ToDateTime(control.SelectedDate.Value.ToString("yyyy"));
    }

更改日期格式显然行不通。

我在 DatePicker 中使用它作为:YearOnly="True"

另一方面,使用下面的 Style 格式化 DatePicker 很棒:

    <Style TargetType="{x:Type DatePickerTextBox}">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <TextBox x:Name="PART_TextBox"
                    Text="{Binding Path=SelectedDate, StringFormat='yyyy', 
                    RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

有没有办法让它工作?谢谢。

经过数小时的测试可能的解决方案后,我得出结论,DatePicker 永远不会接受只有 YearDateTime。我(未)实现了@Clemens 建议的解决方案,希望在某个时候为接受 YearOnly DateTimeDatePicker 找到解决方案。无论如何,我使用的代码对任何感兴趣的人来说都是波纹管。如果有人对我的问题有其他解决方案,请添加此问题的答案。

   private void CustomizableDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {
        if (!this.YearOnly)
            return;

        this.SetValue(SelectedYearProperty, SelectedDate.Value.Year);

        Binding bnd = new Binding
        {
            Path = new PropertyPath("SelectedDate"),
            StringFormat = ("yyyy"),
            RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(CustomizableDatePicker), 1)
        };
        this.innerTextBox.SetBinding(TextBox.CustomizableTextBox.TextProperty, bnd);
    }

.......

 #region YearOnly DependencyProperty

    public bool YearOnly
    {
        get { return (bool)this.GetValue(YearOnlyProperty); }
        set { this.SetValue(YearOnlyProperty, value); }
    }

    public static readonly DependencyProperty YearOnlyProperty =
        DependencyProperty.Register("YearOnly",
        typeof(bool),
        typeof(CustomizableDatePicker),
        new FrameworkPropertyMetadata(false));

    #endregion

    #region SelectedYear DependencyProperty

    public int SelectedYear
    {
        get { return (int)this.GetValue(SelectedYearProperty); }
        set { this.SetValue(SelectedYearProperty, value); }
    }

    public static readonly DependencyProperty SelectedYearProperty =
        DependencyProperty.Register("SelectedYear",
        typeof(int),
        typeof(CustomizableDatePicker));

    #endregion