当wpf日期选择器包含纯wpf文本框时,wpf日期选择器中未更新选定日期
本文关键字:wpf 日期 选择器 更新 包含纯 文本 | 更新日期: 2023-09-27 18:18:22
我扩展了一个wpf日期选择器控件,并在样式中更改了日期选择器文本框样式的模板。我在datepickertextbox的控件模板中添加了一个文本框:
<Style x:Key="DatePickerTextBoxStyle" TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Height" Value="20" />
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox"
Style="{DynamicResource CalendarTextBoxStyle}"
TabIndex="0"
Text="{Binding Path=SelectedDate,
StringFormat='d',
ConverterCulture={x:Static glob:CultureInfo.CurrentCulture},
RelativeSource={RelativeSource AncestorType={x:Type maskedDatePickerLib:MaskedDatePicker}}}"
TextWrapping="Wrap">
</TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我已经覆盖了日期选择器控件的默认模板,只有日期选择器文本框的样式改变了。
现在,问题是当我通过日历选择日期时,它通过绑定显示在文本框中。但是当我通过退格删除日期时,如果我试图从日历中再次选择相同的日期,它不会显示在文本框中。当我通过snoop调查时,我看到DatePicker控件的SelectedDate属性中我删除的值仍然存在,但在文本框中文本属性值为空,因为我删除了它。请建议。
如果您查看DatePicker
控件的默认ControlTemplate
,您将看到它有四个内部控件,其名称以PART_
前缀开头。(您可以在MSDN上的DatePicker样式和模板页面中找到DatePicker
控件的默认ControlTemplate
)。以下是链接页面中的示例:
<Button x:Name="PART_Button"
Grid.Column="1"
Foreground="{TemplateBinding Foreground}"
Focusable="False"
HorizontalAlignment="Left"
Margin="3,0,3,0"
Grid.Row="0"
Style="{StaticResource DropDownButtonStyle}"
VerticalAlignment="Top" />
名称以PART_
前缀开头的控件由DatePicker
类内部使用,因此在新的ControlTemplate
中没有它们将导致问题。该类按名称请求控件,如果没有找到,则无法完成默认功能。
此外,您正试图用正常TextBox
的所有内置功能替换DatePickerTextBox
,然后想知道为什么默认功能不能正常工作……那是因为你把它拆了而没有装上。
虽然我可以看到你已经尝试使用PART_
的名称,但很明显,你不完全理解它的作用。默认的ControlTemplate
中的PART_TextBox
控件的类型是DatePickerTextBox
,但您的TextBox
类型,所以无论DatePicker
类通常对该控件做什么,它现在不能做,因为它是错误的类型。