【问题标题】:UWP: ListView: Default View in a CalendarDatePickerUWP:ListView:CalendarDatePicker 中的默认视图
【发布时间】:2019-09-10 17:32:46
【问题描述】:

在 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# listview uwp calendar


    【解决方案1】:

    当您的日期字段为空时,您将从转换器返回 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;
    }
    

    【讨论】:

    • 很好看,问题确实存在。我进行了更改,一切正常。非常感谢并祝贺您的​​响应!
    猜你喜欢
    • 2015-09-10
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多