从自定义 CollectionViewCell 调用变量 MvxCommand(s)

Calling variable MvxCommand(s) from custom CollectionViewCell

我已经用 mvvmcross 工作了两天,并且从未使用过 iOS,我觉得有些东西我不明白。

我在两列 3 行网格中使用 UICollectionView 创建了我的主菜单,每个项目代表用户点击时可以转到的不同位置。我可以从 UICollectionViewSource 覆盖 "ItemSelected",但是如果不将它的引用传递到创建时的源中,我就无法访问实际的 ViewModel……这对我来说不是正确的方法。

 [MvxRootPresentation(WrapInNavigationController = true)]
    public partial class MainPageView : MvxViewController

    {

    private MenuCollectionSource _menuCollectionSource;
    List<MainMenuItem> menuItems;

    public MainPageViewModel VM
    {
        get { return DataContext as MainPageViewModel; }
    }

    private void SetupMenuCollectionView()
    {
    ......

        collectionView.RegisterNibForCell(MainMenuCollectionViewCell.Nib, MainMenuCollectionViewCell.Key);
        MainMenuItem.Init(menuItems);
        _menuCollectionSource = new MenuCollectionSource(collectionView, MainMenuCollectionViewCell.Key, menuItems);
        _menuCollectionSource.VM = VM; <----doesnt seem right.
        collectionView.Source = _menuCollectionSource;

    public class MenuCollectionSource : MvxCollectionViewSource
    {

        private UICollectionView _collectionView;
        public List<MainMenuItem> Items { get; set; }

        private MainPageViewModel _vm;
        public MainPageViewModel VM
        {
            get { return _vm; }
            set { _vm = value; }
        }

    }

使用此方法我可以覆盖 ViewSource 中的 ItemSelected,然后执行类似

的操作
( Cell is touched -> 
Depending on cell enum/cell# - >
vm.NavigateToCorrectPage())

虽然此方法有效,但我认为这不是处理这种情况的正确方法。 所以我的下一个想法是像这样绑定源...(可能不是 100%,试图在我的脑海中记住)

set.CreateBinding(_menuCollectionSource) .For(s => s.SelectedCommand) .To(vm => vm.NavigateTo) .CommandParameter(_menuCollectionSource.SelectedItem)

但是无论我怎么尝试,传递的参数总是空的,就好像从未设置过所选项目或者在设置之前调用命令一样。

我的 CollectionViewCell class 非常基础

 public enum NavigationLocation
    {
    Search Database,
    Lists,
    etc....
    }
    public partial class MainMenuCollectionViewCell : MvxCollectionViewCell
    {
    public static readonly NSString Key = new NSString("MainMenuCollectionViewCell");
    public static readonly UINib Nib;

        public string MainMenuLabel
        { get { return mainMenuLabel.Text; } }

        public int MainMenuIndexNumber
        { get; set; }

        protected MainMenuCollectionViewCell(IntPtr handle) : base(handle)
        {

        }

        static MainMenuCollectionViewCell()
        {
            Nib = UINib.FromName("MainMenuCollectionViewCell",  NSBundle.MainBundle);
        }

        public static MainMenuCollectionViewCell Create()

        {
            NSArray topLevelObjects = NSBundle.MainBundle.LoadNib("MainMenuCollectionViewCell", null, null);
            MainMenuCollectionViewCell cell = Runtime.GetNSObject(topLevelObjects.ValueAt(0)) as MainMenuCollectionViewCell;
            return cell;
        }

        internal void BindData(string label, string iconBundleName)
        {
             mainMenuLabel.Text = label;
            mainMenuImage.Image = UIImage.FromBundle(iconBundleName);

        }
    }

我在单元格 class 中尝试过的绑定都没有实际起作用,即使在创建时添加 UITapGestureRecognizer 也会导致实际点击时发生崩溃。我 运行 没有想法,有没有人知道我不理解或缺少实际实施的东西

( Cell is touched -> 
GetCellMenuType - >
CallCorrectCommandFromViewModel)

谢谢

使用 SelectedItemChanged 来自 MvxBaseCollectionViewSource

查看

set.Bind(yourCollectionViewSource).For(s => s.SelectionChangedCommand).To(vm => vm.CollectionItemSelected);

ViewModel

public ICommand CollectionItemSelected => new MvxCommand<ItemViewModel>((selectedItem) => { });