2013-07-18 4 views
9

La mia domanda è per MVVMCross in iOS. Ho un TableView personalizzato e un detailView. Come posso associare il mio "showDetailCommand", quindi quando l'utente fa clic su una delle righe su TableView con trigger RowSelected per passare a detailViewModel?MVVMCross iOS: Come attivare RowSelected su un TableViewSource personalizzato utilizzando CreateBindingSet?

Qui è la mia struttura di codice:

public class SearchResultsViewModel: MvxViewModel 
{ 
    private MvxCommand _showDetailCommand; 
    public IMvxCommand ShowDetailCommand 
    { 
     get 
     { 
      _showDetailCommand = _showDetailCommand ?? new MvxCommand(ShowDetailCommandHandler); 
      return _showMapCommand; 
     } 
    } 

    private void ShowDetailCommandHandler() 
    { 
     ShowViewModel<ResultDetailViewModel>(new 
      { 
       city = _filter.City, 
       state = _filter.State, 
       interstate = _filter.Interstate, 
       travelPlaza = _filter.SearchTravelPlaza, 
       hasCatScale = _filter.HasCatScale, 
       hasWashoutExpress = _filter.HasWashoutExpress, 
       hasUndercarriage = _filter.HasUndercarriage, 
       nearest = _nearest 
      }); 
    } 
} 

[Register("SearchResults")] 
public class SearchResultsView : MvxTableViewController 
{ 
    public override void ViewDidLoad() 
    { 
       Title = "List"; 
       base.ViewDidLoad(); 
       var source = new TableViewSource(TableView); 

       var bindings = this.CreateBindingSet<SearchResultsView, SearchResultsViewModel>(); 
       bindings.Bind(source).To(vm => vm.Items); 
       bindings.Apply(); 

       TableView.BackgroundColor = UIColor.Clear; 
       TableView.ShowsVerticalScrollIndicator = false; 
       TableView.ScrollEnabled = true; 
       TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None; 
       TableView.Source = source; 

       TableView.ReloadData(); 

    } 

    public class TableViewSource : MvxTableViewSource 
    { 
     public TableViewSource(UITableView tableView) 
      : base(tableView) 
     { 
      tableView.RegisterClassForCellReuse(typeof(TableViewCell), TableViewCell.CellIdentifier); 
     } 

     public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 
     { 
      var item = GetItemAt(indexPath); 
      return TableViewCell.CellHeight(item); 
     } 

     protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item) 
     { 
      var cell = tableView.DequeueReusableCell(TableViewCell.CellIdentifier) ?? new TableViewCell(); 
      return cell; 
     } 
    } 

} 

[Register("TableViewCell")] 
public class TableViewCell : MvxTableViewCell 
{ 

    public static readonly NSString CellIdentifier = new NSString("TableViewCell"); 

    public TableViewCell() 
     : base() 
    { 
     Initialise(); 
    } 

    public TableViewCell(IntPtr handle) 
     : base(handle) 
    { 
     Initialise(); 
    } 

    private void Initialise() 
    { 

     var titleLabel = new UILabel(new RectangleF(10, 2, 200, 25)); 
     Add(titleLabel); 

     this.DelayBind(() => 
     { 
      var bindings = this.CreateBindingSet<TableViewCell, SearchResultsItemViewModel>(); 
      bindings.Bind(titleLabel).For(x => x.Text).To(vm => vm.Name); 
      bindings.Bind(??).For(x => x.SelectionChangeCommand).To(vm => vm.showDetailCommand); // what should be in this line ?? 
      bindings.Apply(); 
     }); 

    } 

} 

risposta

12

è possibile associare un comando di visualizzazione modello al SelectionChangedCommand sulla sorgente tavolo.

Questa tecnica è illustrata in diversi campioni - per esempio

In alternativa, si può anche mettere i comandi dentro le voci di elenco e può quindi associare all'interno di ogni cella a un SelectedCommand (o qualche altro evento personalizzato all'interno di la tua cella).

Per esempi, consultare alcuni dei campioni con menu - ad es. il campione ValueConversion

+2

Questo è il mio aspetto TableCell. Come posso associare il SelectedCommand all'interno della cella? Non riesco a trovare SelectedCommand ovunque all'interno di MvxTableViewCell. –

+4

Ho modificato la mia domanda sopra per includere la mia classe TableCell come. Non sono ancora sicuro di come eseguire il binding all'interno della cella dopo aver esaminato l'esempio di ValueConversion. Dato che non ho "sorgente" disponibile all'interno di TableCell, come posso associarlo a SelectionChangedCommand? –