从自定义 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) => { });
我已经用 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) => { });