当包含UIViewController第二次初始化时,UITableView到ObservableCollection绑定会中断

时间:2016-01-09 16:54:36

标签: c# xamarin mvvmcross inotifycollectionchanged

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

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

我也在使用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();
}

我的viewmodel如下所示,PlaylistTable是ObservableCollection的子类,Update方法使用add,move和remove来使集合保持最新。

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发布的代码在单元测试和首次观看时正确发布。

0 个答案:

没有答案