5

私は Xamarin と mvvmcross を使用しており、最終的に監視可能なコレクションにバインドされたテーブルを含むビューを使用しています。

このビデオは、カスタム セルの作成方法について非常に有益ですが、最新ではないようです。約 42 分で、Stuart は から派生した彼のテーブルのデータ ソースを作成しますMvxSimpleBindableTableSourceが、そのクラスは存在しないようです。少なくとも、私はそれを見つけることができません。では、mvvmcross を使用して UITableView にバインドする「最良の」方法は何ですか?

また、 MvxTableViewControllerを xib で動作させることができないように見えるため、通常の MvxViewController で UITableView を使用しています。

4

1 に答える 1

15

利用可能な v3 テーブル ソースは次のとおりです。

抽象クラス

  • MvxBaseTableViewSource
    • 基本機能のみ
    • いいえItemsSource- 通常は直接使用しません
  • MvxTableViewSource.cs
    • ベーステーブルから継承し、ItemsSourceデータ バインディング用に追加します
    • 継承クラスは実装するだけでよいprotected abstract UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item);

具体的なクラス

  • MvxStandardTableViewSource.cs
    • から継承MvxTableViewSource
    • 経由で「標準のiPhoneセルタイプ」を提供しますUITableViewCellStyle
    • TitleTextこれらの中で、 、DetailTextImageUrlおよび (少しからかいながら) アクセサリをバインドできます。
  • MvxSimpleTableViewSource.cs
    • から継承MvxTableViewSource
    • コレクション内のすべてのアイテムに単一のセル タイプを提供しますstring nibName-ctor
    • これらのセル内で、好きなものをバインドできます-ビデオを参照してください(後で)
  • MvxActionBasedTableViewSource.cs -新しいクラスを継承せずFunc<>に実装できるいくつかのスタイル フックを提供します。GetOrCreateCellForMvxTableViewSource

一般的に私は使用します:

  • デモで:
    • a MvxStandardTableViewSource- カスタム セルを作成しなくてもリストを取得できるため
  • 実際のコードでは:
    • aMvxSimpleTableViewSource必要な細胞タイプが 1 つだけの場合
    • 複数のセルタイプが必要な場合に継承するカスタムクラス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を参照してください

それ以上:

また、MvxTableViewController を xib で動作させることができないように見えるため、通常の MvxViewController で UITableView を使用しています。

その後修正されたと思います - MvxTableViewController.cs#L33を参照してください

于 2013-06-07T14:23:45.553 に答える