Xamarin iOS为每个UITableView部分获取重复数据

时间:2017-02-16 14:49:41

标签: ios xamarin xamarin.ios mvvmcross

我在我的Xamarin iOS项目中使用MvvmCross。对于我的tableview源我说,a,b,c,d,e,f,g,h记录和节(标题):0适当的视图有3个记录和节:1有4然后

预期结果

科-0 一个 b C 第1 d Ë F 克

我得到了: 第-0 一个 b C 第1 一个 b C d

记录正在重复。我检查了源,但源有正确的数据。

ISSUE:

在每个部分的末尾,源再次从顶部重新开始以填充记录

我的来源:

查看:

base.DoBind();
            var source = new TableSource<string> (Table, ViewModel);
            Table.Source = source;
            Table.ReloadData();
            Table.AlwaysBounceVertical = false;
            var set = this.CreateBindingSet<View, ViewModel>();
            set.Bind(source).To(vm => vm.CardsList);
            set.Apply();

细胞

protected override void DoBind()
        {
            var set = this.CreateBindingSet<Cell, ListViewModel>();
            set.Bind(LblNum).To(vm => vm.CardNumber);
            set.Bind(Balance).To(vm => vm.Balance);
            set.Apply();
        }

CellViewModel

public class ListViewModel : MvxViewModel
    {
        private string _CardNumber;
        public string Number
        {
            get { return _Number); }
            set { _CardNumber = value; }
        }

        private string _Balance;
        public string Balance
        {
            get {  _Balance; }
            set { _Balance = value; }
        }

任何人都可以建议如何解决此问题

更新

    UITableView _tableView;

            public TableSource(UITableView tableView, object item) : base(tableView)
            {
                this.viewModel = item as ViewModel;
                this._tableView = tableView;

                tableView.RegisterNibForCellReuse(HeaderCell.Nib, HeaderCell.Key);      tableView.RegisterNibForCellReuse(UINib.FromName(Cell.Key, NSBundle.MainBundle), Cell.Key);
                tableView.RegisterNibForHeaderFooterViewReuse(UINib.FromName(HeaderCell.Key, NSBundle.MainBundle), HeaderCell.Key);
                tableView.ReloadData();

                var DataDic = new Dictionary<string, List<string>>
                {
                    { "section1", new List<string> {}},
                    { "section2", new List<string> {}},
                    { "section3", new List<string> {}}
                };

                //create the data
                var list = new List<TableModel<string>>();
                foreach (var section in DataDic)
                {
                    var sectionData = new TableModel<string>()
                    {
                        Title = section.Key
                    };
                    foreach (var row in section.Value)
                    {
                        sectionData.Add(row);
                    }

                    list.Add(sectionData);
                }
                TableItems = list;

            } 
public override nint NumberOfSections(UITableView tableView)
        {
            return TableItems.Count;
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            int result = 0;
            if (section == 0)
            {
                result = viewModel.NumOfGiftCards;
            }
            else if (section == 1)
            {
                result = viewModel.NumOfRewardsCerts;
            }

            return result;
        }

        public override nfloat GetHeightForHeader(UITableView tableView, nint section)
        {
            return section == 2 ? 0f : 74f;
        }

        public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
        {
            return indexPath.Section == 2 ? 95f : 62f;
        }

        public override IEnumerable ItemsSource
        {
            get
            {
                return base.ItemsSource;
            }
            set
            {
                base.ItemsSource = value;
                _tableView.ReloadData();
            }
        }

        public override UIView GetViewForHeader(UITableView tableView, nint section)
        {
            var header = tableView.DequeueReusableHeaderFooterView(HeaderCell.Key) as HeaderCell;
            return header;
        }

        protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
        {
            var cell = tableView.DequeueReusableCell(Cell.Key, indexPath) as Cell;

            return cell;
        }

        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            viewModel.CardDetailsCommand.Execute(null);
        }

1 个答案:

答案 0 :(得分:1)

我认为您ItemSource绑定的CardsListTableItemsviewModel.NumOfRewardsCertsviewModel.NumOfGiftCards不匹配你正在使用表源。

您是否看过MvxExpandableItemSource(示例是here)它可以处理2维ItemSources:

private IEnumerable<TItemSource> _itemsSource;
public new IEnumerable<TItemSource> ItemsSource
{
    get
    {
        return _itemsSource;
    }
    set
    {
        _itemsSource = value;
        _sectionExpandableController.ResetState();

        ReloadTableData();
    }
}

它处理从标题扩展和折叠,请参见下文,但您可以禁用该功能并强制它们一直展开: enter image description here