我扩展了一个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>
我已覆盖日期选择器控件的默认模板,仅更改了datepicker文本框的样式。
现在,问题是当我通过日历选择日期时,它通过绑定显示在文本框中。但是当我通过退格键删除日期时,如果我尝试再次从日历中选择相同的日期,它就不会显示在文本框中。当我通过snoop进行调查时,我看到了DatePicker控件的SelectedDate属性,我删除的值仍然存在,但在文本框中,文本属性值为空,因为我删除了它。请建议。
答案 0 :(得分:0)
如果查看ControlTemplate
控件的默认DatePicker
,您会看到它有四个内部控件,其名称以PART_
前缀开头。 (您可以在MSDN上的DatePicker Syles and Templates页面中找到ControlTemplate
控件的默认DatePicker
。以下是链接页面中的示例:
<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
中不使用它们会导致问题。该类按名称请求控件,如果找不到它们,则无法完成默认功能。
此外,您正在尝试将DatePickerTextBox
替换为普通TextBox
的所有内置功能,然后想知道为什么默认功能无法正常工作......它是&#39; s因为你删除了它并且没有替换它。
虽然我可以看到您尝试使用PART_
名称,但很明显您并未完全了解它的作用。默认PART_TextBox
中的ControlTemplate
控件的类型为DatePickerTextBox
,但您的类型为TextBox
,因此无论DatePicker
类通常使用该控件执行什么操作,它现在不能做,因为它是错误的类型。