我正在尝试使用mono touch和slodge mvvmcross创建一个包含剖面的UItable。但是我遇到了一些问题。
在我的数据中,我有一系列包含1-2个元素的部分,而我的tablesource有一个包含所有元素的列表(ItemsSource)。
它显示所有部分都是正确的,但似乎对于每个部分,它从元素总列表中获取元素0和/或1,并且如果它是新的,则不考虑它是新的部分索引部分应该有一个偏移量。但我可能错了。
我是否应该有多个带元素的列表并根据该部分切换tablesource.Itemsource - 我尝试了这种方法但是它陷入了厄运的螺旋:P
任何帮助都是相关的:)
以下是我的tableview代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using Cirrious.MvvmCross.Binding.Touch.ExtensionMethods;
using Cirrious.MvvmCross.Binding.Touch.Views;
using Cirrious.MvvmCross.Commands;
using Cirrious.MvvmCross.Interfaces.Commands;
using Cirrious.MvvmCross.Views;
using CmsApp.Core.Interfaces;
using CmsApp.Core.Model;
using CmsApp.Core.ViewModels;
using CmsApp.Core.ViewModels.Items;
using CmsApp.GtilP.Core.ViewModels.Items;
using CmsApp.Touch.Views.Items;
using MonoTouch.CoreGraphics;
using MonoTouch.ObjCRuntime;
namespace CmsApp.Touch
{
using MonoTouch.Foundation;
using MonoTouch.UIKit;
[Register("WeekItemListViewController")]
public class WeekItemListViewController:CustomListViewController
{
public WeekItemListViewController(IntPtr handle): base(handle)
{
}
private bool _hide;
private List<TableSectionItemViewModel> _cells;
private UmbracoTableViewController _table;
private TabelViewSource _tableSource;
private List<WeekItemTaskViewModel> _listOfTasks;
private List<WeekItemHeaderViewModel> _listOfHeaders;
private List<WeekItemFooterViewModel> _listOfFooter;
private List<List<WeekItemTaskViewModel>> _listOfGroupedTasks;
public bool Hide
{
get { return _hide; }
set { _hide = value;
this.Hidden = _hide;
}
}
public BaseViewModel ViewModel { get; set; }
//custom implementation for adding views to the button row
protected override void AddViews()
{
SortItemsAcoordingToTyoe(ItemsSource);
if(ItemsSource.Count==0)
{
this.Hidden = true;
return;
}
else
{
this.Hidden = false;
}
if(_table!=null)
{
_table.View.RemoveFromSuperview();
}
_table = new UmbracoTableViewController(new RectangleF(0,0,this.Frame.Width,this.Frame.Height), UITableViewStyle.Plain);
_table.TableView.BackgroundColor=UIColor.Clear;
_tableSource = new TabelViewSource(_table.TableView,_listOfHeaders,_listOfFooter,_listOfGroupedTasks);
_tableSource.SelectionChanged += (sender, args) => DoTableSelect((TableSectionItemViewModel)args.AddedItems[0]);
_tableSource.ItemsSource=InitTableCells();;
_table.TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None;
_table.TableView.Source = _tableSource;
this.AddSubview(_table.View);
}
private void SortItemsAcoordingToTyoe(IList itemsSource)
{
_listOfGroupedTasks = new List<List<WeekItemTaskViewModel>>();
_listOfTasks =new List<WeekItemTaskViewModel>();
_listOfHeaders=new List<WeekItemHeaderViewModel>();
_listOfFooter = new List<WeekItemFooterViewModel>();
foreach (SectionItemBaseViewModel sectionItemBaseViewModel in itemsSource)
{
if(sectionItemBaseViewModel.GetType()==typeof(WeekItemHeaderViewModel))
{
_listOfHeaders.Add((WeekItemHeaderViewModel)sectionItemBaseViewModel);
_listOfTasks=new List<WeekItemTaskViewModel>();
_listOfGroupedTasks.Add(_listOfTasks);
}
else if (sectionItemBaseViewModel.GetType() == typeof(WeekItemTaskViewModel))
{
_listOfTasks.Add((WeekItemTaskViewModel)sectionItemBaseViewModel);
}
else if (sectionItemBaseViewModel.GetType() == typeof(WeekItemFooterViewModel))
{
_listOfFooter.Add((WeekItemFooterViewModel)sectionItemBaseViewModel);
}
}
}
private List<TableSectionItemViewModel> InitTableCells()
{
_cells = new List<TableSectionItemViewModel>();
foreach (List<WeekItemTaskViewModel> listOfGroupedTask in _listOfGroupedTasks)
{
foreach (WeekItemTaskViewModel item in listOfGroupedTask)
{
var tableCell = new TableSectionItemViewModel() { TaskViewModel = item };
_cells.Add(tableCell);
}
}
return _cells;
}
private void DoTableSelect(TableSectionItemViewModel tableItemViewModel)
{
/*
string selected = tableItemViewModel.Title;
((WelcomeScreenViewModel) ViewModel).SortViews(selected);
_titleLabel.Text = selected;
*/
int section=0;
int row=0;
NSIndexPath index=null;
foreach(var group in _listOfGroupedTasks)
{
if(group.Contains(tableItemViewModel.TaskViewModel)){
row=group.IndexOf(tableItemViewModel.TaskViewModel);
index = NSIndexPath.FromRowSection(row, section);
break;
}
section++;
}
if(index!=null){
_table.TableView.DeselectRow(index, false);}
}
private class TabelViewSource : MvxBindableTableViewSource
{
private List<WeekItemHeaderViewModel> _listOfHeaders;
private List<WeekItemFooterViewModel> _listOfFooter;
private List<List<WeekItemTaskViewModel>> _listOfGroupedTasks;
public TabelViewSource(UITableView view, List<WeekItemHeaderViewModel> listOfHeaders, List<WeekItemFooterViewModel> listOfFooter, List<List<WeekItemTaskViewModel>> listOfGroupedTasks)
: base(view)
{
_listOfFooter = listOfFooter;
_listOfGroupedTasks = listOfGroupedTasks;
_listOfHeaders = listOfHeaders;
}
public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
return 50.0f;
}
public override int NumberOfSections(UITableView tableview)
{
return _listOfHeaders.Count;
}
public override int RowsInSection (UITableView tableview, int section)
{
List<WeekItemTaskViewModel> list=_listOfGroupedTasks[section];
//this.ItemsSource=list;
return list.Count;
}
public override int SectionFor(UITableView tableview, string title, int atIndex)
{
return atIndex;
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
//var reuse = tableView.DequeueReusableCell(TaskTableCell.Identifier);
// var listOfTasks = _listOfGroupedTasks[indexPath.Section];
// var task = listOfTasks[indexPath.Row];
// if (reuse != null)
// {
// return reuse;
//}
// tjek på type - sektion, item footer
var toReturn = TaskTableCell.LoadFromNib();
return toReturn;
}
/*
public override UIView GetViewForFooter(UITableView tableView, int section)
{
return base.GetViewForFooter(tableView, section);
}
*/
public override string TitleForHeader(UITableView tableView, int section)
{
WeekItemHeaderViewModel header = _listOfHeaders[section];
return header.Title;
}
}
}
public class TableSectionItemViewModel
{
public WeekItemTaskViewModel TaskViewModel { get; set; }
public string Title
{
get{return TaskViewModel.TaskName;}
}
public bool IsExpired
{
get{
return TaskViewModel.IsExpired;
}
}
public bool TaskIsDone
{
get{
return TaskViewModel.TaskIsDone;
}
}
public IImageItem CellBackground
{
get
{
return new LocalImageItem("tablecell_background.png");
}
}
public string[] CheckMarkImage
{
get
{
return TaskViewModel.CheckMarkImageData;
}
}
public IMvxCommand ToggleDone
{
get { return new MvxRelayCommand(CheckBoxPushed); }
}
private void CheckBoxPushed()
{
TaskViewModel.TaskIsDone=!TaskIsDone;
}
}
}
答案 0 :(得分:8)
我真的不明白你目前遇到的问题。
但是,我可以解释一下我如何使用BaseSessionListView.cs会议样本中的部分。
基本上,在该示例中,ItemsSource是一个分组源代码 - 因此ViewModel代码是:
public class SessionGroup : List<Session>
{
public string Key { get; set; }
public SessionGroup(string key, IEnumerable<Session> items)
: base(sessions)
{
Key = key;
}
}
private List<SessionGroup> _groupedList;
public List<SessionGroup> GroupedList
{
get { return _groupedList; }
protected set { _groupedList = value; RaisePropertyChanged("GroupedList"); }
}
这意味着我公开的ItemsSource的结构有点像:
Group
Session
Session
Session
Group
Session
Session
Session
Session
Group
Session
Session
etc
表源中基于Section
的方法是:
public override string[] SectionIndexTitles(UITableView tableView)
{
if (_sessionGroups == null)
return base.SectionIndexTitles(tableView);
return _sessionGroups.Select(x => KeyToString(x.Key, 10)).ToArray();
}
protected override object GetItemAt(NSIndexPath indexPath)
{
if (_sessionGroups == null)
return null;
return _sessionGroups[indexPath.Section][indexPath.Row];
}
public override int NumberOfSections(UITableView tableView)
{
if (_sessionGroups == null)
return 0;
return _sessionGroups.Count;
}
public override int RowsInSection(UITableView tableview, int section)
{
if (_sessionGroups == null)
return 0;
return _sessionGroups[section].Count;
}
这似乎有效......但我不知道这对你的问题有帮助吗?
如果我想添加一个标题元素,那么我想我会更改RowsInSection
和GetItemAt
方法以适应这一点 - 加上GetOrCreateCellFor
返回标题元素细胞也......但我想还有其他方法可以做到这一点吗?