问题描述
我正在使用 sqlite 存储来自 Xamarin.Forms 应用的数据。我希望用户能够将 DatePicker 用于日期,将 TimePicker 用于一段时间,然后将其存储。当我使用以下内容时:
<DatePicker Date="{Binding Date}"
x:Name="DatePicker"
Format="D" />
它正确地将所选日期存储在数据库中,但是当我使用时:
<TimePicker Time="{Binding Time}"
x:Name="TimePicker"
Format="T"/>
每次都将时间存储为 12:00 AM。我错过了什么?
日期和时间都是数据库中的日期时间值。
using System;
using sqlite;
namespace Items.Models
{
public class Item
{
[PrimaryKey,AutoIncrement]
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Location { get; set; }
public DateTime Date { get; set; } = DateTime.Now;
public DateTime Time { get; set; }
}
和
using System.Collections.Generic;
using System.Threading.Tasks;
using sqlite;
using Items.Models;
namespace Item.Data
{
public class ItemDatabase
{
readonly sqliteAsyncConnection database;
public ItemDatabase(string dbPath)
{
database = new sqliteAsyncConnection(dbPath);
database.CreateTableAsync<Item>().Wait();
}
public Task<List<Item>> GetItemsAsync()
{
//Get all items.
return database.Table<Item>().ToListAsync();
}
public Task<Item> GetItemAsync(int id)
{
// Get a specific item.
return database.Table<Item>()
.Where(i => i.ID == id)
.FirstOrDefaultAsync();
}
public Task<int> SaveItemAsync(Item item)
{
if (item.ID != 0)
{
// Update an existing item.
return database.UpdateAsync(item);
}
else
{
// Save a new item.
return database.InsertAsync(item);
}
}
public Task<int> DeleteItemAsync(Item item)
{
// Delete an Item.
return database.DeleteAsync(item);
}
}
}
解决方法
你把TimePicker.Time
的类型弄错了,应该是TimeSpan
而不是DateTime
,所以绑定创建不正确,这就是选择时值不改变的原因TimePicker 上的时间。
修改你的代码如下
public class Item
{
public DateTime Date { get; set; } = DateTime.Now;
public TimeSpan Time { get; set; }
}