UWP:列表视图:日历日期选取器中的默认视图



在Windows 10内部版本18362下的UWP应用程序中,我有一个包含CalendarDatePicker的列表视图。此控件的字段中显示的值以文本格式存储在 SQLite 数据库中。阅读此文本字段(格式为 yyyyMMdd(后,我使用转换器将其转换为日期时间偏移量格式,它工作正常。当日期字段为空时,会出现我的问题(用户在保存数据之前未在日历日期选择器中选择日期(。然后,在页面的打开处,日历日期选择器始终显示默认日期为 01/01/1919,而它应该为我提供定义的占位符文本。下面是页面的 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;
}
}

当您的日期字段为空时,您将从转换器返回日期时间偏移量 dt。dt 具有默认值,因此日历日期选取器始终显示默认数据。因此,当您的日期字段为 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;
}

最新更新