当datepicker包含普通wpf文本框时,选定日期未在wpf datepicker中更新

时间:2014-08-18 10:59:56

标签: c# wpf datepicker

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

1 个答案:

答案 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类通常使用该控件执行什么操作,它现在不能做,因为它是错误的类型。