3

我正在开发这个适用于 iOS 的 MvvmCross 应用程序,我需要在其中使用自定义 TableViewCell。我想知道如何在 MvxSimpleTableViewSource 上实现 SelectedCommand 事件。我让它在 MvxStandardTableViewSource 上工作,我在 youtube 上找到了这个解决方案。该解决方案的问题在于 Stuart 使用了 MvxStandardTableViewSource。另一个问题是我想要将 SelectedChangedCommand 绑定到的模型与我将源绑定到的模型不同。

我已经在互联网上搜索了一段时间以找到这个问题的答案,所以我希望有人可以帮助我解决这个问题。提前致谢。

这是我的代码:

主视图模型.cs

namespace MyApp.Core.ViewModels
{
    public class MainViewModel : BaseViewModel
    {
        private NavigationListViewModel _navigationMenu;
        public NavigationListViewModel NavigationMenu
    {
        get { return _navigationMenu; }
        set { _navigationMenu = value; RaisePropertyChanged(() => NavigationMenu); }
    }

    public void Init()
    {
        NavigationMenu = new NavigationListViewModel();
        NavigationMenu.Init();
    }
}

NavigationListViewModel.cs

namespace MyApp.Core.ViewModels.NavigationViewModels
{
public class NavigationListViewModel : BaseViewModel, IPageSelectedService
{
    private List<NavigationItemViewModel> _navigationList;
    public List<NavigationItemViewModel> NavigationList { 
        get { return _navigationList; } 
        set { _navigationList = value; RaisePropertyChanged(() => NavigationList); } 
    }

    public void Init() {
        NavigationList = new List<NavigationItemViewModel> {
            new NavigationItemViewModel { DisplayName = "Assortment", ActionLink = NavigateToCategories },
            new NavigationItemViewModel { DisplayName = "Shops", ActionLink = NavigateToShops }
        };
    }

    public  ICommand NavigateToCategories 
    {
        get { return new MvxCommand(() => ShowViewModel<CategoryListViewModel>()); }
    }
    public ICommand NavigateToShops
    {
        get { return new MvxCommand(() => ShowViewModel<StoreListViewModel>()); }
    }
}

NavigationItemViewModel.cs

namespace MyApp.Core.ViewModels.NavigationViewModels
{
    public class NavigationItemViewModel : MvxViewModel
    {   
        private string _displayName;
        public string DisplayName
        { 
            get { return _displayName; }
            set { _displayName = value; RaisePropertyChanged(() => DisplayName); }
        }

        private ICommand _actionLink;
        public ICommand ActionLink { 
            get { return _actionLink; } 
            set { _actionLink = value; RaisePropertyChanged(() => ActionLink); }
        }
    }
}

主视图.cs

namespace MyApp.iOS.Views 
{
    public partial class MainView : MvxViewController 
    {
        public new MainViewModel ViewModel {
            get { return (MainViewModel)base.ViewModel; }
            set { base.ViewModel = value; }
        }

        public MainView() : base ("MainView", null) 
        {
        }

        public override void ViewDidLoad() {
            base.ViewDidLoad();

            var set = this.CreateBindingSet<MainView, MainViewModel>();
            var source = new MvxSimpleTableViewSource(menuTableView, MainTableCell.Key, MainTableCell.Key);

            menuTableView.Source = source;
            set.Bind(source).To(vm => vm.NavigationMenu.NavigationList);
            set.Apply();

            menuTableView.ReloadData();
        }
    }
}

主表单元格

namespace MyApp.iOS.Views {
    public partial class MainTableCell : MvxTableViewCell {
        public static readonly UINib Nib = UINib.FromName("MainTableCell", NSBundle.MainBundle);
        public static readonly NSString Key = new NSString("MainTableCell");

        public MainTableCell(IntPtr handle) : base (handle) {
            this.DelayBind(() => {
                var set = this.CreateBindingSet<MainTableCell, NavigationItemViewModel>();
                set.Bind(titleLabel).To(vm => vm.DisplayName);
                set.Apply();
            });
        }

        public static MainTableCell Create() {
            return (MainTableCell)Nib.Instantiate(null, null)[0];
        }
    }
}
4

2 回答 2

6

您可以将 SelectedCommand 属性添加到您的单元格实现中,将其绑定到您的 ActionLink vm 属性并在用户使用https://github.com/slodge/MvvmCross/blob/v3/Cirrious中的 SetSelected 中的代码选择单元格时执行它/Cirrious.MvvmCross.Binding.Touch/Views/MvxStandardTableViewCell.cs

 public ICommand SelectedCommand { get; set; }


    private bool _isSelected;


    public override void SetSelected(bool selected, bool animated)
    {
        base.SetSelected(selected, animated);


        if (_isSelected == selected)
            return;


        _isSelected = selected;
        if (_isSelected)
            if (SelectedCommand != null)
                SelectedCommand.Execute(null);
    }
于 2013-08-21T02:05:01.930 回答
1

斯图尔特的效果很好。这就是我绑定它的方式:

    public MainTableCell(IntPtr handle) : base (handle) {
        this.DelayBind(() => {
            var set = this.CreateBindingSet<MainTableCell, NavigationItemViewModel>();
            set.Bind(titleLabel).To(vm => vm.DisplayName);
            set.Bind().For(s => s.SelectedCommand).To(vm => vm.ActionLink);
            set.Apply();
        });
    }
于 2013-08-21T11:17:00.220 回答