【问题标题】:MvvmCross & MvxAdapter & Polymorphic Types with custom controlsMvvmCross & MvxAdapter & 具有自定义控件的多态类型
【发布时间】:2014-01-28 16:58:18
【问题描述】:

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

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 您的视图模型列表是什么(您的代码表明它是 TodayPanel 对象的列表?)以及 2 您在列表视图项中的片段的含义示例。乐于提供帮助 - 但目前不明白。

标签: xamarin.android mvvmcross


【解决方案1】:

当这种情况发生时我讨厌它,但是在发布我的问题后,我离开了电脑一会儿,开始做其他事情。在那一点上,一切都到位了。 Stuart,在回答您的问题时,TodayPanel 不是 MvxModelView,这是问题的症结所在。我所做的是将 TodayPanels 列表传递到列表视图中,这是一个 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;
    }

然后允许我创建一个 MvxViewModels 列表,然后绑定到 MvxListView 并因此允许执行我想要执行的附加处理。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多