Xamarin.android MvvmCross&;MvxAdapter&;具有自定义控件的多态类型

Xamarin.android MvvmCross&;MvxAdapter&;具有自定义控件的多态类型,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我目前正在尝试实现我自己版本的多态类型演示,该演示位于以下位置: 我让它像演示一样工作。不过,我希望扩展该演示,使其在MvxListView中具有更复杂的控件。我想让每个列表项控制一个片段,该片段有一个视图和一个核心视图模型,以便进行额外的处理 我不确定正确的实施方法 我用于创建自定义视图的代码如下: protected override View GetBindableView(View convertView, Object source, Int32 templateId

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

我让它像演示一样工作。不过,我希望扩展该演示,使其在MvxListView中具有更复杂的控件。我想让每个列表项控制一个片段,该片段有一个视图和一个核心视图模型,以便进行额外的处理

我不确定正确的实施方法

我用于创建自定义视图的代码如下:

        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);
    }
和往常一样,我可能错过了一些简单的事情,但任何帮助都将不胜感激


谢谢

我讨厌这种情况发生,但在发布我的问题后,我离开了电脑一点,开始做其他事情。在这一点上,一切都顺利进行。斯图尔特,在回答你的问题时,今天的小组不是一个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()方法完成的:

然后,我创建了一个扩展方法,将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;
    }
publicstaticbaseviewmodel到seviewmodel(此TodayPanel TodayPanel,TodayViewModel TodayViewModel)
{
BaseViewModel模型=null;
开关(todayPanel.View)
{
案例“Today_QuickView”:
model=Mvx.IocConstruct();
打破
案例“今日辅导日”:
model=Mvx.IocConstruct();
打破
}
if(model==null)
返回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;
Init(todayViewModel);
收益模型;
}
这样,我就可以创建一个MVXViewModel列表,然后将其绑定到MvxListView,从而可以执行我想要执行的附加处理


我确信我可以对最终结果做一些改进,如果您看到任何东西,请随时指出。:)

您是否可以编辑您的问题来解释1您的viewmodel列表是什么(您的代码表明它是一个TodayPanel对象的列表?)和2列表视图项中片段的含义示例。很乐意帮忙,但目前还不明白。
     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;
    }