I want to Change the Format of date selected in DateTimePicker in WPF Application
In XAML:
<toolkit:DatePicker SelectedDateFormat="Long" />
or
<toolkit:DatePicker SelectedDateFormat="Short" />
Add this style to your xaml or App.xaml file
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox"
Text="{Binding Path=SelectedDate, StringFormat='dd.MM.yyyy',
RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
As for me, changing environment to change DatePicker
format (like Thread.CurrentCulture
) is not a good idea.
Sure, you can create Control
derived from DatePicker
and implement dependency property like Format
, but this costs too much effort.
Simple and elegant solution I found is binding value not to SelectedDate
itself, but to some unused property (I used ToolTip
property for this) and update this property when SelectedDate is changed.
C# implementation for one-way binding looks like this:
DatePicker datePicker = new DatePicker();
datePicker.SetBinding(ToolTipProperty, "Date");
datePicker.SelectedDateChanged += (s, ea) =>
{
DateTime? date = datePicker.SelectedDate;
string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
datePicker.ToolTip = value;
};
XAML+C# should look like this:
XAML:
<DatePicker ToolTip="{Binding Date Mode=TwoWay}"
SelectedDateChanged="DatePicker_SelectedDateChanged"/>
C#:
private void DatePicker_SelectedDateChanged(object sender, EventArgs ea)
{
DatePicker datePicker = (DatePicker)sender;
DateTime? date = datePicker.SelectedDate;
string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
datePicker.ToolTip = value;
}
For two-way implementation handle ToolTipChanged
event the same way to update SelectedDate
.