DatetimePicker不更新SelectedDate
我有一个 WPF 问题DatePicker。
DatePicker表单上有两个控件,基于StaticResource DateTheme. 的DateTheme样子:
<ResourceDictionary>
<Style TargetType="{x:Type DatePicker}" x:Key="DateTheme" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DatePicker}">
<DatePicker DisplayDate="{TemplateBinding Property=DisplayDate}" SelectedDate="{TemplateBinding Property=SelectedDate}" Background="#353340" Foreground="Black"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
该DatePicker只是样子:
<DatePicker x:Name="dtpFrom" />
<DatePicker x:Name="dtpTo" />
并且DateTheme包含在 app.xaml 中:
<ResourceDictionary Source="DateTheme.xaml" />
但是在选择新日期并单击按钮后,代码中仍使用旧日期。SelectedDate不在控件中更新。
这里SelectedDate仍然是旧日期,而新选择的日期显示在屏幕上:
if (dtpFrom.SelectedDate > dtpTo.SelectedDate)
SelectedDate在标准DateTimePicker控件中选择新日期时如何实际更改?
回答
它不起作用,因为TemplateBinding不支持双向绑定。
A
TemplateBinding是模板场景的 Binding 的优化形式,类似于Binding使用{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}. ATemplateBinding始终是单向绑定,即使涉及的属性默认为双向绑定。
如果您使用相对源绑定来TemplatedParent代替,它将起作用(但不要这样做)。
<Style TargetType="{x:Type DatePicker}" x:Key="DateTheme" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DatePicker}">
<DatePicker DisplayDate="{Binding DisplayDate, RelativeSource={RelativeSource TemplatedParent}}"
SelectedDate="{Binding SelectedDate, RelativeSource={RelativeSource TemplatedParent}}"
Background="#353340"
Foreground="Black"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然而,这不是正确的方法。您不应将 aDatePicker放在控件模板中。控件模板应从基本元素构建以构成控件的视觉外观,而不是控件本身。这可能会由于递归而导致错误。
在这种情况下,它也是不必要的,因为带有两个 setter 的简单样式会得到相同的结果。
<Style TargetType="{x:Type DatePicker}" x:Key="DateTheme" >
<Setter Property="Background" Value="#353340"/>
<Setter Property="Foreground" Value="Black"/>
</Style>