我正在使用 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 发布的代码在单元测试和首次查看时正确运行。