MVVMCross iOS 在 table 刷新后重新选择 table 行
MVVMCross iOS reselect table row after table refresh
有谁知道如何在 table 刷新后使 iOS table 视图在视觉上重新 select 一行?
这是我当前的实现:
主视图
public override void ViewDidLoad()
{
base.ViewDidLoad();
var source = new MvxSimpleTableViewSource(MainTableView, MainInspectionCell.Key, MainInspectionCell.Key);
MainTableView.Source = source;
var set = this.CreateBindingSet<MainView, MainViewModel>();
set.Bind(source).To(vm => vm.Inspections);
set.Bind(source).For(s => s.SelectionChangedCommand).To(vm => vm.ItemSelectedCommand);
set.Bind(source).For(s => s.SelectedItem).To(vm => vm.SelectedInspection);
....
set.Apply();
MainTableView.ReloadData();
}
MainViewModel
我有一条消息会在同步完成后发送出去,处理方式如下:
private async void OnSyncUpdate(UpdatedInspectionsMessage message)
{
var updatedInspections = await inspectionManager.GetInspectionsAsync(cancellationToken);
Inspections = new ObservableCollection<Inspection>(updatedInspections);
ItemSelectedCommand.Execute(SelectedItem);
}
这里的想法是.. 当同步完成并且我的 table 刷新以执行一行 select 并重新突出显示我 select 编辑的项目。现在发生的事情是我的 selected 行在刷新之前是灰色的。刷新后,我的 SelectedItem 仍处于填充状态,但该行不再是灰色。
有什么想法吗?
所以我通过发布一条新消息使它起作用。我想知道是否有更简洁的方法来执行此操作,但这对我有用。
当我在我的 ViewModel 中完成刷新时,我会执行以下操作:
InvokeOnMainThread(async () =>
{
await Task.Delay(250, cancellationToken);
ItemSelectedCommand.Execute(newSelected);
messenger.Publish(new DoneUpdatingInspectionsMessage(this));
});
然后在我的 iOS 视图中,我订阅了 DoneUpdatingInspectionsMessage,它执行以下操作:
var path = NSIndexPath.FromRowSection(MainViewModel.Inspections.IndexOf(MainViewModel.SelectedInspection), 0);
MainTableView.SelectRow(path, true, UITableViewScrollPosition.None);
注意:我需要构建一个延迟,因为它在我的加载指示器消失之前触发,这导致该行未显示为选中状态。
有谁知道如何在 table 刷新后使 iOS table 视图在视觉上重新 select 一行?
这是我当前的实现:
主视图
public override void ViewDidLoad()
{
base.ViewDidLoad();
var source = new MvxSimpleTableViewSource(MainTableView, MainInspectionCell.Key, MainInspectionCell.Key);
MainTableView.Source = source;
var set = this.CreateBindingSet<MainView, MainViewModel>();
set.Bind(source).To(vm => vm.Inspections);
set.Bind(source).For(s => s.SelectionChangedCommand).To(vm => vm.ItemSelectedCommand);
set.Bind(source).For(s => s.SelectedItem).To(vm => vm.SelectedInspection);
....
set.Apply();
MainTableView.ReloadData();
}
MainViewModel
我有一条消息会在同步完成后发送出去,处理方式如下:
private async void OnSyncUpdate(UpdatedInspectionsMessage message)
{
var updatedInspections = await inspectionManager.GetInspectionsAsync(cancellationToken);
Inspections = new ObservableCollection<Inspection>(updatedInspections);
ItemSelectedCommand.Execute(SelectedItem);
}
这里的想法是.. 当同步完成并且我的 table 刷新以执行一行 select 并重新突出显示我 select 编辑的项目。现在发生的事情是我的 selected 行在刷新之前是灰色的。刷新后,我的 SelectedItem 仍处于填充状态,但该行不再是灰色。
有什么想法吗?
所以我通过发布一条新消息使它起作用。我想知道是否有更简洁的方法来执行此操作,但这对我有用。
当我在我的 ViewModel 中完成刷新时,我会执行以下操作:
InvokeOnMainThread(async () =>
{
await Task.Delay(250, cancellationToken);
ItemSelectedCommand.Execute(newSelected);
messenger.Publish(new DoneUpdatingInspectionsMessage(this));
});
然后在我的 iOS 视图中,我订阅了 DoneUpdatingInspectionsMessage,它执行以下操作:
var path = NSIndexPath.FromRowSection(MainViewModel.Inspections.IndexOf(MainViewModel.SelectedInspection), 0);
MainTableView.SelectRow(path, true, UITableViewScrollPosition.None);
注意:我需要构建一个延迟,因为它在我的加载指示器消失之前触发,这导致该行未显示为选中状态。