ios - MVVMCross iOS 如何在 TableViewCell 按钮中传递参数

标签 ios uitableview mvvmcross observablecollection icommand

我的 tableviewcell 中有一个按钮,我试图将 DataContext 作为参数传递给 tableviewcell 中的按钮命令。以便可以在 View 模型中执行命令操作。这是我在 tableviewcell 类中的代码:

public partial class AssociatedEntCell : MvxTableViewCell
{
    public static readonly NSString Key = new NSString(nameof(AssociatedEntCell));

    private const string BindingText = "AssociatedEnt Username";

    public AssociatedEntCell(IntPtr handle) : base(BindingText, handle)
    {
        InitialiseBindings();
    }

    private void InitialiseBindings()
    {
        this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<AssociatedEntCell, AssociationItemViewModel>();

            set.Bind(btnDeleteAssociation).To(vm => vm.DeleteAssociationCommand).CommandParameter(this.DataContext);
            set.Apply();
        });
    }

    public string AssociatedEnt { get { return lblAssociatedName.Text; } set { lblAssociatedName.Text = value; } }

}

第一次就完美运行;但是一旦我对关联的 ObservableCollection 执行清除和添加操作,DataContext 就不会更新,并且我得到与以前相同的旧 DataContext。下面是 ObservableCollection 的 ViewModel 片段:

    private MvxObservableCollection<AssociationItemViewModel> associatedEntities;
    public MvxObservableCollection<AssociationItemViewModel> AssociatedEntities
    {
        get { return associatedEntities; }
        set { SetProperty(ref associatedEntities, value); }
    }

    private async Task LoadAssociations()
    {
        Dispatcher.RequestMainThreadAction(() => { 
            AssociatedEntities.Clear();
        });

        //Fetching the list from API
        var res = await businessFacade.GetAssociations(entityID, true);

            if (res == null || !res.Any())
            {
                return;
            }

            foreach (var item in res)
            {
                var associationItem = new AssociationItemViewModel
                {
                    AccountName = item.acname,
                    AccountNum = item.acnum.GetValueOrDefault(),
                    UserID = item.usrid.GetValueOrDefault(),
                    Username = item.usrname,
                    DeleteAssociationCommand = this.DeleteAssociationCommandInit
                };

                Dispatcher.RequestMainThreadAction(() => { 
                AssociatedEntities.Add(associationItem);
                });
            }
        }
    }

但是,除了 DataContext 之外, View 并没有失去其绑定(bind),并且 TableView 显示新更新的行,与 ObservableCollection 中的相同。

有没有办法为命令获取更新的 DataContext?或即使在对 observablecollection 进行更改后也能知道真正的 indexPath 的任何可能方法?

最佳答案

我最终使用一个单独的属性来保存索引路径,如下所示:

我的 TableviewSource:

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

        if (cell != null)
        {
            cell.Index = indexPath.Row;
        }

        return cell;
    }

还有我的手机:

public partial class AssociatedEntCell : MvxTableViewCell
{
    public static readonly NSString Key = new NSString(nameof(AssociatedEntCell));

    private const string BindingText = "AssociatedEnt Username; AssociatedUserID UserID";

    public AssociatedEntCell(IntPtr handle) : base(BindingText, handle)
    {
        InitialiseBindings();
    }

    private void InitialiseBindings()
    {
        this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<AssociatedEntCell, AssociationItemViewModel>();

            set.Bind(btnDeleteAssociation).To(vm => vm.DeleteAssociationCommand).CommandParameter(this.Index);

            set.Apply();
        });
    }

    public string AssociatedEnt { get { return lblAssociatedName.Text; } set { lblAssociatedName.Text = value; } }

    public int AssociatedUserID { get; set; }

    public int Index { get; set; }

}

关于ios - MVVMCross iOS 如何在 TableViewCell 按钮中传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330399/

相关文章:

android - mvvmcross android 中的分段 RecyclerView

android - 使用 IMvxMessenger 获取消息两次

ios - 在 iOS/Mac 上通过 GCD 实现多线程

ios - RxSwift Textfield debounce subscribe 没有调用

ios - NSNotificationcenter 没有成员名称 'defaultCenter"错误 -Swift

ios - 应用名称更改

iphone - 为什么第二次崩溃?

iphone - 旋转后如何重新排列 UITableViewCell 中的对象?

Xamarin.Forms 与 Xamarin Mvvmcross

ios - 步进器增加标签的值,然后乘以数组中 init 函数内部的值