2014-01-28 3 views
0

я в настоящее время пытается осуществить свою собственную версию полиморфных типов демо, который находится здесь:MvvmCross & MvxAdapter & Полиморфные типы с пользовательскими элементами управления

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

И у меня он работает как демо-шоу. Тем не менее, я хочу расширить эту демонстрацию, чтобы иметь более сложные элементы управления внутри MvxListView. Я хочу, чтобы каждый из элементов списка управлял фрагментом, который имеет View и core 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); 
    } 

Как всегда, это, вероятно, что-то простое, что мне не хватает, но любая помощь будет оценена.

Спасибо!

+0

Можете ли вы отредактировать свой вопрос, чтобы объяснить 1, что такое список вашей модели (ваш код предполагает, что это список объектов TodayPanel?) И 2 пример того, что вы подразумеваете под фрагментом внутри элемента списка. С удовольствием пытаюсь помочь, но пока не понимаю. – Stuart

ответ

1

Я ненавижу, когда это происходит, но после публикации моего вопроса я немного отошел от компьютера и начал делать что-то еще. В этот момент все встало на свои места. Стюарт, в ответ на ваш вопрос, TodayPanel не был MvxModelView, и в этом была суть проблемы. То, что я делал, это передать список TodayPanels в listview, который был объектом сущности SQLite, а не объектом MvxModelView.

Для других, которые могут быть с этим связаны, я собираюсь опубликовать свое решение здесь.

Итак, вот что я в итоге сделал. Сначала я создал класс для каждого из объектов сущности TodayPanel, унаследованных от абстрактного базового класса, унаследованного от MvxModelView.

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 и, следовательно, имеют право делать дополнительную обработку, что я хочу сделать.

Я уверен, что есть некоторые улучшения, которые я могу сделать до конечного результата, и если вы видите что-нибудь, не стесняйтесь указать на это. :)

Смежные вопросы