3

Xamarin と MvvmCross を使用して、iOS で展開可能なリスト ビューを作成しようとしています。

シナリオは、リストビューがあり、リストビューの行が選択されると、展開 (アニメーション) して、遅延読み込みによって読み込まれたコレクション ビューを表示することです。

これが私がこれまでに持っているコードです:

アダプター:

public class MercatoAnimatedExpandableTableSource : MvxTableViewSource
{
    private readonly string _key;
    private readonly List<object> items;
    private Dictionary<object, bool> expandableState = new Dictionary<object, bool>(); 

    public MercatoAnimatedExpandableTableSource(UITableView tableView, IEnumerable<object> items, UINib nib, string key)
        : base(tableView)
    {
        _key = key;
        this.items = items.ToList();
        this.items.ForEach(x => expandableState[x] = true);
        tableView.RegisterNibForCellReuse(nib, key);
    }

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

        cell.Frame = new RectangleF(cell.Frame.X, cell.Frame.Y, cell.Frame.Width, GetHeightForRow(tableView, indexPath));

        return cell;
    }

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        base.RowSelected(tableView, indexPath);

        var isExpanded = expandableState[items[indexPath.Row]];

        expandableState[items[indexPath.Row]] = !isExpanded;

        var row = this.GetCell(tableView, indexPath);

        (row as FamilysubgroupViewCell).ExpandCells();

        tableView.ReloadRows(new[] { indexPath }, UITableViewRowAnimation.Automatic); 
    }

    public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
    {
        var isExpanded = expandableState[items[indexPath.Row]];
        if (isExpanded)
        {
            return 25;
        }

        return 400;
    }

    protected override object GetItemAt(NSIndexPath indexPath)
    {
        return items[indexPath.Row];
    }
}

セル :

    public FamilySubgroupViewCell (IntPtr handle) : base (handle)
    {
        this.DelayBind(() =>
        {
            this.FamilyCollectionViewContainer.BackgroundColor = UIColor.Blue;
            var bindingset = this.CreateBindingSet<FamilySubgroupViewCell, FamilySubTypeViewModel>();
            bindingset.Bind(this.FamilyGroupTitleLabel).To(x => x.FamilySubType.FamilySubGroupDescription);
            bindingset.Bind(this.FamilyGroupDescLabel).To(x => x.FamilySubType.FamilySubGroupDetail); 
            bindingset.Apply();
        });

    }

    public void ExpandCells(Action onUpdate)
    {
        var context = this.DataContext as FamilySubTypeViewModel;
        context.PopulateAndRun(() =>
        {
            Debug.WriteLine("Populating Models complete : now showing cells");
            var collection = new FamilySubGroupModelsCollection();
            collection.ViewModel = context;
            Debug.WriteLine("FamilySubGroupCell : Showing {0} Items", context.FamilyModels.Count);

            this.FamilyCollectionViewContainer.Add(collection.View);

            if (onUpdate != null) onUpdate();
        });
    }

問題

したがって、セルが選択されると、新しい高さを与える「isExpanded」プロパティが反転します。これは正常に機能します。次に、セルを「展開」するメッセージがセルに送信され、新しいコレクションがロードされてビューに追加されます (View アウトレット経由)。

ただし、コレクションがビューで再レンダリングされることはありません。正常に入力され、ビューに追加されますが、新しく展開されたセルに実際に表示されることはありません。DelayBind() メソッドでセルが最初に作成されたときにロードすると (つまり、遅延ロードなし)、正常に動作します。

セルの再描画などを試しました

this.Draw(this.Bounds);

コレクションがビューに追加された後ですが、役に立ちませんでした。

私は何を間違っていますか?

4

1 に答える 1