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;
}
在我的 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;
}