MVVMCross iOS在表刷新后重新选择表行

时间:2015-02-04 23:02:51

标签: ios xamarin.ios mvvmcross

是否有人知道如何在刷新表后以可视方式重新选择一个iOS表格视图?

这是我目前的实施:

的MainView

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

这里的想法是..当同步完成并且我的表刷新以进行行选择并重新突出显示我选择的项目时。现在发生的事情是我选择的行在刷新之前是灰色的。刷新后,我的SelectedItem仍然被填充但行不再是灰色。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以我通过发布新消息来实现这一点。我想知道是否有更清洁的方法可以做到这一点,但这对我有用。

当我在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);

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