从绑定表源继承的类

时间:2013-06-07 14:11:43

标签: ios xamarin mvvmcross

我正在使用Xamarin和mvvmcross以及如何使用最终绑定到可观察集合的表的视图。

video提供了有关如何创建自定义单元格的信息,但似乎已过时。在大约42分钟时,Stuart为他的表创建了一个源自MvxSimpleBindableTableSource的数据源,但该类似乎不存在,或者至少,我找不到它。那么用mvvmcross绑定到UITableView的“最佳”方式是什么?

另外,我在常规的MvxViewController中使用UITableView,因为我似乎无法让MvxTableViewController与xib一起工作,this question似乎建议目前不可能。

1 个答案:

答案 0 :(得分:15)

可用的v3表源是:

抽象类

  • MvxBaseTableViewSource
    • 仅限基本功能
    • ItemsSource - 一般不直接使用
  • MvxTableViewSource.cs
    • 继承自基础广告,并为数据绑定添加ItemsSource
    • 继承类只需要实现protected abstract UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item);

具体课程

  • MvxStandardTableViewSource.cs
    • 继承自MvxTableViewSource
    • 通过UITableViewCellStyle
    • 提供“标准iPhone手机类型”
    • 在这些内容中,您可以绑定TitleTextDetailTextImageUrl和(带一些戏弄)附件
  • MvxSimpleTableViewSource.cs
    • 继承自MvxTableViewSource
    • 为集合中的所有项目提供单个单元格类型 - 通过string nibName
    • 中的ctor
    • 在这些单元格中,您可以绑定您喜欢的内容 - 请参阅视频(稍后)
  • MvxActionBasedTableViewSource.cs - 提供了一些Func<>样式挂钩,允许您在不继承GetOrCreateCellFor
  • 新类的情况下实施MvxTableViewSource

一般我用:

  • 在演示中:
    • a MvxStandardTableViewSource - 因为我得到了一个列表而无需创建自定义单元格
  • 在实际代码中:
      当我只需要一种细胞类型时,
    • 一个MvxSimpleTableViewSource
    • 当我需要多个单元格类型时,从MvxTableViewSource继承的自定义类 - 例如见下文

具有多个单元格类型的常规TableSource通常看起来像PolymorphicListItemTypesView.cs

public class PolymorphicListItemTypesView
    : MvxTableViewController
{
    public PolymorphicListItemTypesView()
    {
        Title = "Poly List";
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var source = new TableSource(TableView);
        this.AddBindings(new Dictionary<object, string>
            {
                {source, "ItemsSource Animals"}
            });

        TableView.Source = source;
        TableView.ReloadData();
    }

    public class TableSource : MvxTableViewSource
    {
        private static readonly NSString KittenCellIdentifier = new NSString("KittenCell");
        private static readonly NSString DogCellIdentifier = new NSString("DogCell");

        public TableSource(UITableView tableView)
            : base(tableView)
        {
            tableView.RegisterNibForCellReuse(UINib.FromName("KittenCell", NSBundle.MainBundle),
                                              KittenCellIdentifier);
            tableView.RegisterNibForCellReuse(UINib.FromName("DogCell", NSBundle.MainBundle), DogCellIdentifier);
        }

        public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
        {
            return KittenCell.GetCellHeight();
        }

        protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath,
                                                              object item)
        {
            NSString cellIdentifier;
            if (item is Kitten)
            {
                cellIdentifier = KittenCellIdentifier;
            }
            else if (item is Dog)
            {
                cellIdentifier = DogCellIdentifier;
            }
            else
            {
                throw new ArgumentException("Unknown animal of type " + item.GetType().Name);
            }

            return (UITableViewCell) TableView.DequeueReusableCell(cellIdentifier, indexPath);
        }
    }
}

  

此视频提供了有关如何创建自定义单元格的信息,但似乎已过时

它只是在Xamarin 2.0和V3之前制作,但原理非常相似。

该文章的代码已更新 - 请参阅https://github.com/slodge/MvvmCross-Tutorials/tree/master/MonoTouchCellTutorial

除此之外:

  

另外,我在常规MvxViewController中使用UITableView,因为我似乎无法让MvxTableViewController与xib一起工作,这个问题似乎表明目前不可能。

我认为此后已修复 - 请参阅MvxTableViewController.cs#L33