Xamarin.Form的问题(从Akavache缓存绑定ListView不刷新)
Problem of Xamarin.Form (ListView not refresh if binding from Akavache cache)
我遇到了刷新列表的问题。
我在 Visual Studio 2019 (Xamarin.Forms 4.3.0.991250) & Akavache 6.6.1 中使用 MasterDetailPage
初始化默认值,有一个变量是 [=13 类型的项目=].
首先,我添加了一个项目到缓存(我称这个对象为 TodoItem)。然后显示带有从 Akavache 缓存获取的项目绑定的 ListView,但它不起作用,项目有值 -> ListView
不刷新。
我尝试了一些东西:
更改版本(Xamarin.Forms & Akavache),例如:XF 4.1 最高版本和 akavache 降级 6.0、6.1、6.2...=> 不工作。
如果使用硬编码设置项目 new ObservableCollection(new ListView(){ ... }) => 它正在工作。
如果应用 运行,我在布局上更改了一些内容并保存(Xaml 热重载)-> 它正在运行。
public ObservableCollection 项 { get;放; } = new ObservableCollection();
#region AddNewCommand
private Command _addNewCommand;
public Command AddNewCommand =>
_addNewCommand ?? (_addNewCommand = new Command(async (p) => await AddNewExecute(), (p) => !IsBusy));
private async Task AddNewExecute()
{
var key = Guid.NewGuid().ToString().Substring(0, 5);
await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem() {Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0));
var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>();
Items = new ObservableCollection<TodoItem>(list);
}
#endregion
为了更改 UI 的变量绑定端,您必须在 BeginInvokeOnMainThread
中进行
像这样:
private async Task AddNewExecute()
{
var key = Guid.NewGuid().ToString().Substring(0, 5);
await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem()
{
Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0));
Device.BeginInvokeOnMainThread (async () => {
var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>();
Items = new ObservableCollection<TodoItem>(list);
});
}
通过这种方式,您将更改 UI 线程上的变量
我遇到了刷新列表的问题。
我在 Visual Studio 2019 (Xamarin.Forms 4.3.0.991250) & Akavache 6.6.1 中使用 MasterDetailPage
初始化默认值,有一个变量是 [=13 类型的项目=].
首先,我添加了一个项目到缓存(我称这个对象为 TodoItem)。然后显示带有从 Akavache 缓存获取的项目绑定的 ListView,但它不起作用,项目有值 -> ListView
不刷新。
我尝试了一些东西:
更改版本(Xamarin.Forms & Akavache),例如:XF 4.1 最高版本和 akavache 降级 6.0、6.1、6.2...=> 不工作。
如果使用硬编码设置项目 new ObservableCollection(new ListView(){ ... }) => 它正在工作。
如果应用 运行,我在布局上更改了一些内容并保存(Xaml 热重载)-> 它正在运行。
public ObservableCollection 项 { get;放; } = new ObservableCollection();
#region AddNewCommand private Command _addNewCommand; public Command AddNewCommand => _addNewCommand ?? (_addNewCommand = new Command(async (p) => await AddNewExecute(), (p) => !IsBusy)); private async Task AddNewExecute() { var key = Guid.NewGuid().ToString().Substring(0, 5); await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem() {Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0)); var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>(); Items = new ObservableCollection<TodoItem>(list); } #endregion
为了更改 UI 的变量绑定端,您必须在 BeginInvokeOnMainThread
中进行像这样:
private async Task AddNewExecute()
{
var key = Guid.NewGuid().ToString().Substring(0, 5);
await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem()
{
Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0));
Device.BeginInvokeOnMainThread (async () => {
var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>();
Items = new ObservableCollection<TodoItem>(list);
});
}
通过这种方式,您将更改 UI 线程上的变量