首页 > 解决方案 > UWP:ListView: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;
    }
}

标签: c#listviewuwpcalendar

解决方案


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

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;
}

推荐阅读