DatetimePicker 不更新 SelectedDate

DatetimePicker not updating SelectedDate

我遇到了 WPF 问题 DatePicker

窗体上有两个 DatePicker 控件,基于 StaticResource DateThemeDateTheme 看起来像:

<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" Style="{StaticResource DateTheme}" />
<DatePicker x:Name="dtpTo" Style="{StaticResource DateTheme}" />

并且 DateTheme 包含在 app.xaml 中:

<ResourceDictionary Source="DateTheme.xaml" />

但在选择新日期并单击按钮后,代码中仍使用旧日期。 SelectedDate 不在控件中更新。

此处 SelectedDate 仍然是旧日期,而新选择的日期显示在屏幕上:

if (dtpFrom.SelectedDate > dtpTo.SelectedDate)

在标准 DateTimePicker 控件中选择新日期时如何实际更改 SelectedDate

它不起作用,因为 TemplateBinding 不支持双向绑定。

A TemplateBinding is an optimized form of a Binding for template scenarios, analogous to a Binding constructed with {Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}. A TemplateBinding is always a one-way binding, even if properties involved default to two-way binding.

如果您使用相对源绑定到 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>

但是,不是正确的方法。你不应该把 DatePicker 放在它自己的控件模板中。控件模板应该从构成控件视觉外观的基本元素构建,而不是控件本身。由于递归,这可能会导致错误。

在这种情况下也没有必要,因为带有两个 setter 的简单样式会得到相同的结果。

<Style TargetType="{x:Type DatePicker}" x:Key="DateTheme" >
   <Setter Property="Background" Value="#353340"/>
   <Setter Property="Foreground" Value="Black"/>
</Style>