我目前正在尝试实现我自己的多态类型演示版本,该版本位于此处:
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);
}
与往常一样,这可能是我想念的简单事情,但任何帮助都会受到赞赏。
谢谢!
答案 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,因此可以执行我想要执行的其他处理。
我确信我可以对最终结果做一些改进,如果你看到任何事情可以随意指出。 :)