MVVMCROSS绑定TimeSyncProblem

时间:2014-04-25 15:20:56

标签: ios xamarin mvvmcross

我在将数据绑定到mvxtablieviewsource的itemsource时遇到了一个特殊问题。 我试图生成一个收藏夹列表,通过点击不同的tablview在核心中生成收藏夹。

通常情况下,我得到的数据绑定工作方式如下:(只是基本结构)

控制器:

var source = new MySource(TableView);

this.AddBindings(new Dictionary<object, string>
                    {
                    {source, "ItemsSource Favs"}

                        });

来源:

private List<FavModel> _favs;

public override IEnumerable ItemsSource
        {
            get { return _favs; }

            set
            {                
                    _favs = (List<FavModel>)value;
                    ReloadTableData();

            }
        }

protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
        {
            var cell = new AdFavCell();         
            cell.TextLabel.Text = ((FavModel)item).Display;
            return cell;


        }

通常它的效果非常好但是在这种情况下,我通过对用户的触摸做出反应来生成数据,我有这种奇怪的失败;

  • 当我在ItemsSource的setter中设置断点时,等待一段时间然后它就能正常工作。
  • 当我没有断点运行时,tableview保持空白。

我还想到如果我在设置器中插入一个手动暂停,那么它也可以工作:

设置暂停:

public override IEnumerable ItemsSource
            {
                get { return _mydata; }

                set
                {                
                        _favs = (List<FavModel>)value;
                        ReloadTableData();
                        Task.Delay(1000).Wait();
                }
            }

我也尝试过延迟绑定,但它没有用。

有人知道问题出在哪里吗?

编辑:

这里有一些额外的信息:

如何生成数据:

我已经获得了内容的桌面视图,并且根据单元格的长按,我创建了一个popumenu,您可以在其中添加收藏夹。

检测longclick:

protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
        {


            MvxTableViewCell cell = null;


            if (item is SoccerEventListModel)
            {

                cell = tableView.DequeueReusableCell(this.CellIdentifier) as SoccerEvent;

                if (cell == null)
                {

                    cell = new SoccerEvent((SoccerEventListModel)item);
                    cell.AddGestureRecognizer(new UILongPressGestureRecognizer((e) =>
                    {
                        if (e.State == UIGestureRecognizerState.Began)
                        {

                            var command = ItemLongClickCommand;
                            if (command != null)
                                command.Execute(item);
                        }
                    }));

                    return cell;

                }

            }
        }

将Longclick绑定到核心:

EventListViewModel.EventFavViewCallbackEvent += EventListViewModel_EventFavViewCallbackEvent;



        void EventListViewModel_EventFavViewCallbackEvent(EventModel e)
        {

                var StoreFav = new EventFavoritesView { ViewModel = new EventFavoritesViewModel { ID = e.ID } };

                View.Add(StoreFav.View);



        }

根据单元格的ID,它会通过向我们的服务器发送请求来创建收藏夹列表。

更新

private long _id;
        public long ID
        {
            get { return _id; }
            set { _id = value; RaisePropertyChanged(() => ID); Update(); }
        }

收到数据后,RaisePropertyChanged()应该使视图重新加载其内容。

private List<FavModel> _favs;
        public List<FavModel> Favs
        {
            get { return _favs; }
            set { _favs = value; RaisePropertyChanged(() => Favs); }
        }

视图模型:

public class EventFavoritesViewModel : MvxViewModel
    {
        private readonly EventFavoritesService _eventFavoriteService;
        private readonly UserFavoritesService _userFavoriteService;

        private long _id;
        public long ID
        {
            get { return _id; }
            set { _id = value; RaisePropertyChanged(() => ID); Update(); }
        }

        private string _title;
        public string Title
        {
            get { return _title; }
            set { _title = value; RaisePropertyChanged(() => Title); }
        }

        private List<FavModel> _favs;
        public List<FavModel> Favs
        {
            get { return _favs; }
            set { _favs = value; RaisePropertyChanged(() => Favs); }
        }

        private MvxCommand<FavModel> _itemSelectedCommand;
        public System.Windows.Input.ICommand ItemSelectedCommand
        {
            get
            {
                _itemSelectedCommand = _itemSelectedCommand ?? new MvxCommand<FavModel>(ToggleFav);
                return _itemSelectedCommand;
            }
        }

        public void Init(long eventID)
        {
            MvxTrace.Trace("We get the details", Logger.Errorlevel.Debug);
            ID = eventID;
        }

        public EventFavoritesViewModel()
        {
            _eventFavoriteService = new EventFavoritesService(UpdateEventFav);
            _userFavoriteService = new UserFavoritesService(UpdateUserFav);
        }

        private void UpdateUserFav(Fav[] favlist)
        {
            MvxMessenger.Publish(new UserFavUpdateMessage(this, favlist));
        }

        private void Update()
        {
            Favs = _eventFavoriteService.GetFavforEvent(ID).MapToFavs();
        }

        private void UpdateEventFav(Fav[] favlist)
        {
            Favs = favlist.MapToFavs();
        }

        private void ToggleFav(FavModel item)
        {
            MvxTrace.Trace("Got Item: " + item.Display);
            item.NewSubscription = !item.NewSubscription;
        }

        private IMvxMessenger MvxMessenger
        {
            get
            {
                return Mvx.Resolve<IMvxMessenger>();
            }
        }

        public void SaveFavs()
        {
            foreach (var fav in Favs)
            {
                if (fav.AlreadySubscribed != fav.NewSubscription)
                {
                    if (fav.NewSubscription)
                        _userFavoriteService.PutToUserFavorites(fav.MapToFav());
                    else
                        _userFavoriteService.DeleteFromUserFavorites(fav.MapToFav());
                }
            }
        }
    }

我希望这是足够的信息,否则只需告诉我。:-) 谢谢你的帮助。

0 个答案:

没有答案