0

是否可以在日期选择器的文本框中自动格式化用户输入日期?

我有以下代码

<Style TargetType="{x:Type DatePicker}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/>
    <Setter Property="IsTodayHighlighted" Value="True"/>
    <Setter Property="SelectedDateFormat" Value="Short"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="CalendarStyle" Value="{DynamicResource DatePickerCalendarStyle}" />
</Style>

<Style TargetType="{x:Type DatePickerTextBox}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <TextBox x:Name="PART_TextBox"
 Text="{Binding Path=SelectedDate, StringFormat='dd/MM/yyyy', 
 RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在我看来,我有

<DatePicker Height="25" HorizontalAlignment="Left" Margin="518,34,0,0" Name="DateThru" VerticalAlignment="Top" Width="115" SelectedDate="{Binding DateThruSelected, Mode=TwoWay}" IsEnabled="{Binding DateThruIsEnabled}" >
</DatePicker>

所以两个问题。首先,当我输入文本框“030613”或“03062013”​​并点击时,我希望它会在 datpicker 的文本框中自动格式化为“03/06/2013”​​。

其次,我期望 SelectedDate 属性设置为“03/06/2013”​​。(如果我从嵌入式日历中选择一个日期,则 SelectedDate 绑定可以正常工作。)

我在此处发布的当前代码两者都没有。知道如何实现这两个目标吗?

提前致谢!

4

1 回答 1

0

关于第一期:

我想到了正则表达式。为了便于使用,请尝试使用一些抽象类,并派生它,例如:

public abstract class DateTimeRegexPattern
{
    public abstract DateTime DateTime { get; }

    public abstract bool IsMatch(string input);
}

对于您希望它被识别的每个模式,您派生该抽象类(可以增强),并将它们放在一个列表中。每当文本框的内容发生变化时,为了检测可以应用哪种模式,请使用 LINQ。

List<DateTimeRegexPattern> patterns = new List<DateTimeRegexPattern>();
// Fill the list with one instance of each of derived classes of DateTimeRegexPattern
DateTimeRegexPattern matching = patterns.FirstOrDefault(x => x.IsMatch("030613"));

然后,如果有任何模式匹配,则检索 DateTime,如果当前 Date 不同,则将其应用于 DatePicker 。

关于第二个问题: http: //msdn.microsoft.com/fr-fr/library/system.windows.controls.datepicker.selecteddatechanged.aspx这个事件应该可以解决问题。当日期更改时,如果日期不同,请更改文本框的内容。

于 2013-08-19T23:45:34.343 回答