DatetimePicker 不更新 SelectedDate
DatetimePicker not updating 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" 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>
我遇到了 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" 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 aBinding
constructed with{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}
. ATemplateBinding
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>