MvvmCross& MvxAdapter&具有自定义控件的多态类型

时间:2014-01-28 16:58:18

标签: xamarin.android mvvmcross

我目前正在尝试实现我自己的多态类型演示版本,该版本位于此处:

https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/Working%20With%20Collections

我在演示中表现出色。但是,我希望扩展该演示以在MvxListView中包含更复杂的控件。我想让每个列表项控制一个具有View和核心ViewModel的片段以进行其他处理。

我不确定实施此方法的正确方法。

我用来创建自定义视图的代码是:

        protected override View GetBindableView(View convertView, Object source, Int32 templateId)
    {
        var listItem = (TodayPanel) source;

        if (listItem != null)
            templateId = (Int32) typeof (Resource.Layout).GetField(listItem.View).GetValue(null);

        return base.GetBindableView(convertView, source, templateId);
    }

与往常一样,这可能是我想念的简单事情,但任何帮助都会受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:1)

我讨厌发生这种情况,但在发布我的问题后,我离开电脑一会儿,开始做其他事情。那时,一切都被点击了。 Stuart,回答你的问题,TodayPanel不是一个MvxModelView,其中就是问题的症结所在。我正在做的是将TodayPanels列表传递到listview,它是一个SQLite实体对象而不是MvxModelView对象。

对于可能正在努力解决这个问题的其他人,我将在这里发布我的解决方案。

所以这就是我最终要做的事情。我首先为从继承自MvxModelView的抽象基类继承的每个TodayPanel实体对象创建了一个类。

public abstract class TodayBaseViewModel : MvxViewModel
{
    protected TodayViewModel TodayViewModel { get; set; }
    protected IDataService DataService { get; set; }

    public String Name { get; set; }
    public String Title { get; set; }
    public Boolean CanHide { get; set; }
    public Boolean Visible { get; set; }
    public Int32 SortOrder { get; set; }
    public String View { get; set; }

    protected abstract void SetEventHandlers();

    protected BaseViewModel(IDataService dataService)
    {
        DataService = dataService;
    }

    public void Init(TodayViewModel todayViewModel)
    {
        TodayViewModel = todayViewModel;

        SetEventHandlers();
    }
}

我把它作为抽象,因为我希望在最终的类中附加0个或更多的事件处理程序。这是通过抽象的SetEventHandlers()方法完成的:

public class CoachSaysViewModel : TodayBaseViewModel
{
    public CoachSaysViewModel(IDataService dataService)
        : base(dataService)
    {
    }

    protected override void SetEventHandlers()
    {
        TodayViewModel.ConnectionUpdated += TodayViewModelConnectionUpdated;
        TodayViewModel.NewActivityReceived += TodayViewModelNewActivityReceived;
    }

    protected void TodayViewModelNewActivityReceived(Object sender, EventArgs.ActivityReceivedEventArgs e)
    {

    }

    protected void TodayViewModelConnectionUpdated(Object sender, EventArgs.ConnectionUpdatedEventArgs e)
    {

    }
}

然后我创建了一个扩展方法,将TodayPanel实体转换为继承自TodayBaseViewModel的类之一。

     public static BaseViewModel ToBaseViewModel(this TodayPanel todayPanel, TodayViewModel todayViewModel)
    {
        BaseViewModel model = null;

        switch (todayPanel.View)
        {
            case "Today_QuickView":
                model = Mvx.IocConstruct<QuickViewViewModel>();
                break;

            case "Today_CoachSays":
                model = Mvx.IocConstruct<CoachSaysViewModel>();
                break;
        }

        if (model == null)
            return null;

        model.CanHide = todayPanel.CanHide;
        model.Name = todayPanel.Name;
        model.SortOrder = todayPanel.SortOrder;
        model.Title = todayPanel.Title;
        model.View = todayPanel.View;
        model.Visible = todayPanel.Visible;

        model.Init(todayViewModel);

        return model;
    }

然后允许我创建一个MvxViewModel列表,然后将其绑定到MvxListView,因此可以执行我想要执行的其他处理。

我确信我可以对最终结果做一些改进,如果你看到任何事情可以随意指出。 :)