2013-08-20 2 views
3

Я работаю над этим приложением MvvmCross для iOS, в котором мне нужно использовать собственный TableViewCell. Я хотел бы знать, как реализовать событие SelectedCommand на MvxSimpleTableViewSource. Я получил его для работы MvxStandardTableViewSource, и я нашел this решение на youtube. Проблема с этим решением заключается в том, что Stuart использует MvxStandardTableViewSource. Другая проблема заключается в том, что модель, которую я хочу связать с SelectedChangedCommand, не является той же моделью, к которой я привязываю источник.MvvmCross iOS SelectedCommand для пользовательского TableViewCell

Я искал в Интернете какое-то время, чтобы найти ответ на эту проблему, поэтому я надеюсь, что кто-то может мне помочь в этом. Заранее спасибо.

Вот мой код:

MainViewModel.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); } 
     } 
    } 
} 

MainView.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(); 
     } 
    } 
} 

MainTableCell

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]; 
     } 
    } 
} 

ответ

6

Вы можете добавить свойство SelectedCommand к вашей реализации ячейки, связать, что к вашему ActionLink Vm собственности и его выполнение, когда пользователь выбирает ячейку с помощью кода, как в SetSelected в https://github.com/slodge/MvvmCross/blob/v3/Cirrious/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); 
    } 
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(); 
     }); 
    } 
Смежные вопросы