UWP:ListView:CalendarDatePicker 中的默认视图

UWP: ListView: Default View in a CalendarDatePicker

在我的 Windows 10 build 18362 下的 UWP 应用程序中,我有一个包含 CalendarDatePicker 的 ListView。此控件字段中显示的值以文本格式存储在 SQLite 数据库中。阅读此文本字段(格式 yyyyMMdd)后,我使用转换器将其转换为 DateTimeOffset 格式,并且工作正常。我的问题发生在日期字段为空时(用户在保存数据之前未在 CalendarDatePicker 中选择日期)。然后,在页面打开时,CalendarDatePicker 始终显示默认日期 01/01/1919,而它应该为我提供定义的 PlaceholderText。以下是页面的 XAML 代码和转换器背后的代码的摘录。 欢迎任何帮助。谢谢。

<ListView x:Name="listVProjets"
                  Margin="0,140,0,40"
                  IsItemClickEnabled="True" 
                  ItemClick="ListVProjets_ItemClick"
                  SelectionChanged="ListVProjets_SelectionChanged"
                  >


            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local1:Projets">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="40" />
                            <ColumnDefinition Width="40" />
                            <ColumnDefinition Width="240" />
                            <ColumnDefinition Width="150" />
                            <ColumnDefinition Width="150" />
                            <ColumnDefinition Width="110" />
                            <ColumnDefinition Width="110" />
                        </Grid.ColumnDefinitions>

                        <Button     Grid.Column="0"
                                    x:Name="btnOpenSProj"
                                    Content="--"
                                    Tag="{Binding}"
                                    Click="BtnOpenSProj_Click"/>
                        <CheckBox   Grid.Column="1"
                                    x:Name="chkBoxProj"
                                    Margin="15,0,0,0"
                                    Tag="{Binding}"
                                    Click="ChkBoxProj_Click"
                                    IsChecked="{Binding IsChk, Converter={StaticResource NullableBooleanToBooleanConverter}, Mode=OneWay}"/>
                        <TextBox Grid.Column="2" 
                                   x:Name="nomProjTxt"
                                   Margin="20,0,0,0" 
                                   TextWrapping="NoWrap" 
                                   BorderBrush="Transparent"
                                   Text="{Binding NomProj, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                   FontSize="16" 
                                   Foreground="Black"
                                   PlaceholderText="Nom du projet"
                                   SelectionChanged="NomProjTxt_SelectionChanged"/>

                        <CalendarDatePicker Grid.Column="3" 
                                   Name="dateprojPTxt"
                                   Margin="20,0,0,0" 
                                   BorderBrush="Transparent"
                                   FontSize="16" 
                                   Foreground="Black"
                                   IsTodayHighlighted="True"
                                   DateChanged="DateprojPTxt_DateChanged"
                                   Tag="{Binding}"
                                   Date="{x:Bind DateProjPrevu, Converter={StaticResource StringToDateTimeOffsetConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DateFormat="{}{day.integer(2)}/{month.integer(2)}/{year.full}"
                                   />

public class StringToDateTimeOffsetConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        DateTimeOffset dt;
        if (value != null && value is string)
        {
            var stringToConvert = value as string;
            if (!DateTimeOffset.TryParse(stringToConvert, out dt))
            {
                return null;
            }
        }
        return dt;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        string time;
        if (value != null && value is DateTimeOffset)
        {
            var valueToConvert = (DateTimeOffset)value;
            time = new DateTime(valueToConvert.Ticks).ToString("yyyyMMdd");
        }
        else
        {
            time = null;
        }
        return time;
    }
}

当您的日期字段为空时,您将return 来自转换器的 DateTimeOffset dt。 dt 具有默认值,因此您的 CalendarDatePicker 始终显示默认数据。因此,当您的日期字段为空时,您应该从转换器中 return 空,如下所示。

public object Convert(object value, Type targetType, object parameter, string language)
{
    DateTimeOffset dt;
    if (value != null && value is string)
    {
        var stringToConvert = value as string;
        if (!DateTimeOffset.TryParse(stringToConvert, out dt))
        {
            return null;
        }
    }
    else if (value == null) {
        return null;
    }
    return dt;
}