2012-11-23 6 views
4

J'essaye de créer un UItable avec des sections en utilisant le toucher mono et le slv mvvmcross. Cependant, j'ai quelques problèmes.Création de UITable avec la section en utilisant Mono touch et slob mvvmcross

Dans mes données, j'ai une gamme de sections avec 1-2 éléments et ma source de données ont une liste (ItemsSource) contenant tous les éléments.

Il montre toutes les sections correctes, mais il semble que pour chaque section, il prend l'élément 0 et/ou 1 de la liste totale des éléments et ne prend pas en compte qu'il s'agit d'une nouvelle section, si c'est un nouvelle section, l'index devrait avoir un décalage. Mais j'ai peut-être tort.

Dois-je être d'avoir la liste avec plusieurs éléments et le SWITH tablesource.Itemsource selon la section - j'ai essayé cette approche mais il wwnt dans une spirale de malheur: P

Toute aide est aprécié :)

Ce qui suit est mon code pour le 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

Merci pour la question Bjarke. Pouvez-vous développer davantage ce que vous entendez par "si c'est une nouvelle section, l'index devrait avoir un décalage" - par ex. une sorte d'explication ou de schéma montrant ce que vous voyez et ce que vous attendez de voir. Le seul endroit où j'ai utilisé des sections jusqu'ici était dans l'échantillon de conf ... et peut-être que j'ai fait la mauvaise chose là-bas! – Stuart

+0

I Stuart Je regarde votre exemple maintenant. Je crois que mon problème pourrait être que j'ai tous les éléments dans une liste et ils ne sont pas groupés. Dois-je avoir une liste de listes pour la source de données. Itemssource? – Bjarke

+0

Salut encore stuart. J'ai oublié cette partie de votre exemple et par conséquent il s'est lié aux éléments incorrects: objet de substitution protégé GetItemAt (NSIndexPath indexPath) { if (_sessionGroups == null) return null; return _sessionGroups [indexPath.Section] [chemin_index]; } – Bjarke

Répondre

8

Je ne comprends pas vraiment le problème que vous voyez à l'heure actuelle.

Cependant, je peux expliquer comment j'ai utilisé des sections dans BaseSessionListView.cs l'échantillon de la conférence.

En fait, dans cet échantillon le ItemsSource était une source groupée - donc le code ViewModel était:

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"); } 
} 

Cela signifiait que mon exposé ItemsSource avait une structure un peu comme:

Group 
    Session 
    Session 
    Session 
Group 
    Session 
    Session 
    Session 
    Session 
Group 
    Session 
    Session 
etc 

Le Section méthodes basées dans la source de la table étaient alors:

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; 
} 

Cela a semblé fonctionner ... mais je ne sais pas si cela aide votre question?


Si je l'avais voulu ajouter un élément d'en-tête, alors je suppose que je viens de changer les méthodes RowsInSection et GetItemAt pour accueillir ce - plus le GetOrCreateCellFor pour retourner les cellules d'éléments d'en-tête trop ... mais je suppose il y aura d'autres façons de le faire aussi?

+0

Pourquoi ne pas utiliser IGrouping à la place? – Softlion

+0

Peut-être pourriez-vous développer un peu cette question?S'il vous plaît également considérer que, après presque 2 ans, cette question et réponse pourrait ne pas être si fraîche dans ma mémoire :) – Stuart

Questions connexes