【问题标题】:DatetimePicker not updating SelectedDateDatetimePicker 不更新 SelectedDate
【发布时间】:2021-04-14 07:32:55
【问题描述】:

我遇到了 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

【问题讨论】:

  • 您要解决的实际问题是什么?根据您的描述,您似乎希望两个 DatePickers 都显示相同的日期,但没有任何上下文,很难猜出合适的解决方案。
  • 问题是在选择新日期并单击按钮后,您会在代码中获得旧日期。 SelectedDate 不会在控件中更新。
  • 为什么是TemplateBinding 而不是Binding

标签: .net wpf xaml controltemplate


【解决方案1】:

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

TemplateBinding 是针对模板场景的优化形式的 Binding,类似于使用 {Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay} 构造的 BindingTemplateBinding 始终是单向绑定,即使涉及的属性默认为双向绑定。

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

【讨论】:

  • 哦,这么简单!根本不要使用控制模板 :) 谢谢!
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多