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);

注意:我需要构建一个延迟,因为它在我的加载指示器消失之前触发,这导致该行未显示为选中状态。