1

我正在使用 mvvmcross 和 xamarin 将 ObservableCollection 绑定到 UITableView。使用 Add、Remove 和 Move 方法就地更新集合。这些调用正确触发 INotifyCollectionChanged 事件,并且 TableView 在第一次显示包含表的视图时按预期更新。如果用户作为正常应用程序流程的一部分离开原始视图,但稍后返回正确的数据,则会将数据加载到表中,但调用添加、移动和删除不再更新表。

  • 更新集合时仍会触发 INotifyCollectionChanged 事件
  • 如果我在 MvxStandardTableViewSource 的子类中手动订阅这些事件并尝试在 UITableView 上调用 ReloadData 仍然不会更新
  • 我的演示者正在创建视图模型的新实例,并在每次访问页面时查看。

我还在我的应用程序中使用 Xamarin-Sidebar ( https://components.xamarin.com/view/sidebarnavigation ) 进行导航,并使用自定义演示者加载视图,但据我所知,视图是通过完全初始化的相同的代码路径,无论是第一次访问还是后续访问。

我的演示者 Show() 方法如下所示:

public override void Show(MvxViewModelRequest request)
{
    if (request.PresentationValues != null)
    {
        if(NavigationFactory.CheckNavigationMode(request.PresentationValues, NavigationFactory.ClearStack))
        {
            MasterNavigationController.ViewControllers = new UIViewController[0];
            base.Show(request);
        }
        else if(NavigationFactory.CheckNavigationMode(request.PresentationValues, NavigationFactory.LoadView))
        {
            var root = MasterNavigationController.TopViewController as RootViewController;
            var view = this.CreateViewControllerFor(request) as UIViewController;
            root.SidebarController.ChangeContentView(view);
        }
    }
    else
    {
        base.Show(request);
    }
}

我的 ViewController 中的绑定如下所示:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;

    var source = new TracksTableSource(TableView, "TitleText Title; ImageUrl ImageUrl", ViewModel);
    TableView.Source = source;

    var set = this.CreateBindingSet<TracksViewController, TracksViewModel>();
    set.Bind(source).To(vm => vm.PlaylistTable);
    set.Apply();
}

我的视图模型如下,其中 PlaylistTable 是 ObservableCollection 的子类,其中 Update 方法使用添加、移动和删除来保持集合是最新的。

public class TracksViewModel : MvxViewModel
{
    private readonly IPlaylistService _playlistService;
    private readonly IMessengerService _messengerService;
    private readonly MvxSubscriptionToken _playlistToken;

    public PlaylistTable PlaylistTable { get; set; }

    public TracksViewModel(IPlaylistService playlistService, IMessengerService messengerService)
    {
        _playlistService = playlistService;
        _messengerService = messengerService;

        if (!messengerService.IsSubscribed<PlaylistUpdateMessage>(GetType().Name))
            _playlistToken = _messengerService.Subscribe<PlaylistUpdateMessage>(OnDirtyPlaylist, GetType().Name);
    }

    public void Init(NavigationParameters parameters)
    {
        PlaylistTable = new PlaylistTable(parameters.PlaylistId);
        UpdatePlaylist(parameters.PlaylistId);
    }

    public async void UpdatePlaylist(Guid playlistId)
    {
        var response = await _playlistService.Get(playlistId);
        PlaylistTable.Update(new Playlist(response));
    }

    private void OnDirtyPlaylist(PlaylistUpdateMessage message)
    {
        UpdatePlaylist(message.PlaylistId);
    }

}

此设置在第一次初始化视图并正确更新表时完美运行,只有第二次和后续时间初始化视图时表无法更新。谁能解释为什么在两个实例中使用相同的技术创建视图时绑定失败?

如果需要,我可以发布额外的代码,但我相信问题在于我如何使用演示者,因为我没有从 PlaylistTable 发布的代码在单元测试和首次查看时正确运行。

4

0 回答 0