2013-08-20 28 views
3

我正在爲此iOS MvvmCross應用程序工作,其中我需要使用自定義TableViewCell。我想知道如何在MvxSimpleTableViewSource上實現SelectedCommand事件。我得到它的工作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的財產,當用戶在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

制定出很好的斯圖爾特選擇使用像的setSelected代碼的單元格執行。這是我如何綁定它:

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