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不支持双向绑定。

ATemplateBinding是模板场景的 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>


以上是DatetimePicker不更新SelectedDate的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>