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
永远不会接受只有 Year
的 DateTime
。我(未)实现了@Clemens 建议的解决方案,希望在某个时候为接受 YearOnly DateTime
的 DatePicker
找到解决方案。无论如何,我使用的代码对任何感兴趣的人来说都是波纹管。如果有人对我的问题有其他解决方案,请添加此问题的答案。
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
我正在使用自定义日期选择器,我正在尝试通过依赖项 属性 更改日期格式以仅显示年份。经过一些实验后,我得到了一个 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
永远不会接受只有 Year
的 DateTime
。我(未)实现了@Clemens 建议的解决方案,希望在某个时候为接受 YearOnly DateTime
的 DatePicker
找到解决方案。无论如何,我使用的代码对任何感兴趣的人来说都是波纹管。如果有人对我的问题有其他解决方案,请添加此问题的答案。
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