MVVMCROSS Ios绑定ShowViewModel [英] MVVMCROSS Ios Binding ShowViewModel

查看:89
本文介绍了MVVMCROSS Ios绑定ShowViewModel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在模型中通过调用showviewmodel-method进行导航后,在mvvmcross中存在数据绑定问题.在Android方面,它可以正常工作.

问题是导航本身正在工作,但是我没有从模型中获取任何数据.

模型中的导航:

ShowViewModel<TeamEventDetailsViewModel>(new { eventID = item.ID });

包含数据的ViewModel:

public class TeamEventDetailsViewModel
        : EventDetailsViewModel
    {
        public TeamEventModel CurrentEvent
        {
            get { return MyCurrentEvent as TeamEventModel; }
            set
            {
                MyCurrentEvent = value; 
                RaisePropertyChanged(() => CurrentEvent);
                TickerModel.Comments = value.Comments;
                RaisePropertyChanged(() => TickerModel);
                LineupModel.Team1Players = value.Team1Players;
                LineupModel.Team2Players = value.Team2Players;
                RaisePropertyChanged(() => LineupModel);
            }
        }

        private EventDetailsLineupViewModel _lineupModel = new EventDetailsLineupViewModel();
        public EventDetailsLineupViewModel LineupModel
        {
            get { return _lineupModel; }
            set { _lineupModel = value; RaisePropertyChanged(() => LineupModel); }
        }

        public TeamEventDetailsViewModel()
        {
          EventToken = MvxMessenger.Subscribe<EventUpdateMessage>(OnEventUpdateMessage);
        }

        private void OnEventUpdateMessage(EventUpdateMessage eventUpdate)
        {
            if (MyCurrentEvent != null && eventUpdate.Event.ID == MyCurrentEvent.ID)
            {
                var updatedEvent = (TeamEventModel)eventUpdate.Event;
                var myEvent = CurrentEvent;
                if(updatedEvent.Score!=null)
                    myEvent.Score = updatedEvent.Score;
                if (updatedEvent.Team1Players != null)
                    myEvent.Team1Players = updatedEvent.Team1Players;
                if (updatedEvent.Team2Players != null)
                    myEvent.Team2Players = updatedEvent.Team2Players;

                CurrentEvent = myEvent;
            }
        }

        protected override void Update(EventModel eventdetails)
        {
            CurrentEvent = (TeamEventModel) eventdetails;
        }

        private string _teststring = "success";

        public string Teststring
        {
            get { return _teststring; }
            set
            {
                _teststring = value;
                RaisePropertyChanged(()=>_teststring);
            }
        }
    }

正如您在底部看到的那样,我实现了一个测试字符串以证明其功能.

在视图中绑定:

public class TeamEventDetailsView : MvxViewController
    {

        public UILabel TestLabel = new UILabel();

        public TeamEventDetailsViewModel TeamEventDetailsViewModel
        {
            get { return (TeamEventDetailsViewModel)base.ViewModel; }
            set { base.ViewModel = value; }
        }

        public override void ViewDidLoad()
        {
            View.AddSubview(TestLabel);


            this.CreateBinding(TestLabel).To<TeamEventDetailsViewModel>(vm => vm.Teststring).Apply();

            TestLabel.BackgroundColor = UIColor.Orange;

        }        

        public override void ViewDidLayoutSubviews()
        {
            base.ViewDidLayoutSubviews();
            TestLabel.Frame=new RectangleF(0,20,View.Frame.Width,80);
        }
    }

因此,我重复一遍,导航本身可以工作,但是模型中的数据没有显示在视图上.

如果我在View中手动创建ViewModel,那么绑定也可以工作,但是在我的情况下,我无法做到这一点,因为数据是根据ViewModel生成的数据(调用导航过程)提取的. >

手动ViewModel:

TeamEventDetailsViewModel = new TeamEventDetailsViewModel();
TeamEventDetailsViewModel.Init(9816);

正如我所知,我所做的与Stuard在其教程中所做的完全相同:

https://www.youtube.com/watch?v=cbdPDZmuHk8

有人对我有建议吗? 谢谢.

解决方案

MvvmCross在base.ViewDidLoad()中创建ViewModel-如果将该调用添加到您的ViewDidLoad覆盖中,则一切正常

I've got problem with data-binding in mvvmcross after doing the navigation in the model by calling the showviewmodel-method. On the android side it works.

So the Problem is, that the navigation itself is working but I don't get any data from the model.

Navigation in the model:

ShowViewModel<TeamEventDetailsViewModel>(new { eventID = item.ID });

ViewModel which containts the Data:

public class TeamEventDetailsViewModel
        : EventDetailsViewModel
    {
        public TeamEventModel CurrentEvent
        {
            get { return MyCurrentEvent as TeamEventModel; }
            set
            {
                MyCurrentEvent = value; 
                RaisePropertyChanged(() => CurrentEvent);
                TickerModel.Comments = value.Comments;
                RaisePropertyChanged(() => TickerModel);
                LineupModel.Team1Players = value.Team1Players;
                LineupModel.Team2Players = value.Team2Players;
                RaisePropertyChanged(() => LineupModel);
            }
        }

        private EventDetailsLineupViewModel _lineupModel = new EventDetailsLineupViewModel();
        public EventDetailsLineupViewModel LineupModel
        {
            get { return _lineupModel; }
            set { _lineupModel = value; RaisePropertyChanged(() => LineupModel); }
        }

        public TeamEventDetailsViewModel()
        {
          EventToken = MvxMessenger.Subscribe<EventUpdateMessage>(OnEventUpdateMessage);
        }

        private void OnEventUpdateMessage(EventUpdateMessage eventUpdate)
        {
            if (MyCurrentEvent != null && eventUpdate.Event.ID == MyCurrentEvent.ID)
            {
                var updatedEvent = (TeamEventModel)eventUpdate.Event;
                var myEvent = CurrentEvent;
                if(updatedEvent.Score!=null)
                    myEvent.Score = updatedEvent.Score;
                if (updatedEvent.Team1Players != null)
                    myEvent.Team1Players = updatedEvent.Team1Players;
                if (updatedEvent.Team2Players != null)
                    myEvent.Team2Players = updatedEvent.Team2Players;

                CurrentEvent = myEvent;
            }
        }

        protected override void Update(EventModel eventdetails)
        {
            CurrentEvent = (TeamEventModel) eventdetails;
        }

        private string _teststring = "success";

        public string Teststring
        {
            get { return _teststring; }
            set
            {
                _teststring = value;
                RaisePropertyChanged(()=>_teststring);
            }
        }
    }

As you can see at the bottom I implemented a teststring to prove functionality.

Binding in the View:

public class TeamEventDetailsView : MvxViewController
    {

        public UILabel TestLabel = new UILabel();

        public TeamEventDetailsViewModel TeamEventDetailsViewModel
        {
            get { return (TeamEventDetailsViewModel)base.ViewModel; }
            set { base.ViewModel = value; }
        }

        public override void ViewDidLoad()
        {
            View.AddSubview(TestLabel);


            this.CreateBinding(TestLabel).To<TeamEventDetailsViewModel>(vm => vm.Teststring).Apply();

            TestLabel.BackgroundColor = UIColor.Orange;

        }        

        public override void ViewDidLayoutSubviews()
        {
            base.ViewDidLayoutSubviews();
            TestLabel.Frame=new RectangleF(0,20,View.Frame.Width,80);
        }
    }

So I repeat, the navigation itself works but the data from model doesn't get shown on the view.

If I create the ViewModel manually in the View then the binding works also, but in my Situation I can't do that because the Data is pulled depending on the generated Data from the ViewModel which calls the navigation-proceed.

Manual ViewModel:

TeamEventDetailsViewModel = new TeamEventDetailsViewModel();
TeamEventDetailsViewModel.Init(9816);

As I can tell I did exactly the same as Stuard does in his Tutorial:

https://www.youtube.com/watch?v=cbdPDZmuHk8

Does anyone has an advice for me? Thanks.

解决方案

MvvmCross does the ViewModel create in base.ViewDidLoad() - if you add that call to your ViewDidLoad override then everything should work ok

这篇关于MVVMCROSS Ios绑定ShowViewModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆