当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属性中我删除的值仍然存在,但在文本框中文本属性值为空,因为我删除了它。请建议。

当wpf日期选择器包含纯wpf文本框时,wpf日期选择器中未更新选定日期

如果您查看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类通常对该控件做什么,它现在不能做,因为它是错误的类型。