2016-08-12 3 views
1

Ich habe eine TableView in iOS und in meinem ViewModel, ich habe eine Eigenschaft zu Selected Item in TableView, aber ich kann nicht das ausgewählte Objekt für diese Eigenschaft binden. Wie kann ich das machen? Mein Projekt ist plattformübergreifend. Ich habe ein Android-Projekt und ein iOS-Projekt. In Android-Projekt habe ich die Bindung:MvvmCross - wie an SelectedItem in iOS TableView zu binden?

<Mvx.MvxListView 
        android:id="@+id/lstViewTasks" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:clickable="true" 
        android:focusableInTouchMode="true" 
        android:choiceMode="multipleChoice" 
        local:MvxBind="ItemsSource Tasks; SelectedItem SelectedTask; ItemClick ShowTaskCommand" 
        local:MvxItemTemplate="@layout/projectmytasksitem" /> 

, aber ich kann nicht eine gleichwertige Bindung in iOS.

, dass meine Tableviewcontroller ist:

[Register("ProjectMyTasksViewc")] 
public class ProjectMyTasksViews : MvxTableViewController<ProjectMyTasksViewModel> 
{ 
     //other things 

     var source = new MvxSimpleTableViewSource(TableView, ProjectMyTasksItem.Key, ProjectMyTasksItem.Key); 
     TableView.Source = source; 

     this.CreateBinding(source).To<ProjectMyTasksViewModel>(viewModel => viewModel.Tasks).Apply(); 
     this.CreateBinding(source).For(s => s.SelectedItem).To<ProjectMyTasksViewModel>(viewModel => viewModel.SelectedTask).Apply(); 
     this.CreateBinding(source).For(tableSource => tableSource.SelectionChangedCommand).To<ProjectMyTasksViewModel>(viewModel => viewModel.ShowTaskCommand).Apply(); 

} 

Hier ist meine Viewmodel:

public class ProjectMyTasksViewModel : MvxViewModel 
{ 

public Action ShowTaskCommandAction { get; set; } 

private IList<Task> _tasks; 
public IList<Task> Tasks 
{ 
    get { return _tasks; } 
    set { _tasks = value; RaisePropertyChanged(() => Tasks); } 
} 

private Task _selectedTask; 
public Task SelectedTask 
{ 
    get { return _selectedTask; } 
    set { _selectedTask = value; RaisePropertyChanged(() => SelectedTask); } 
} 

private MvxCommand _showTaskCommand; 
public MvxCommand ShowTaskCommand 
{ 
    get 
    { 
     _showTaskCommand = _showTaskCommand ?? (_showTaskCommand = new MvxCommand(ExecuteShowTaskCommand)); 
     return _showTaskCommand; 
    } 
} 

private void ExecuteShowTaskCommand() 
{ 
    if (!SelectedTask.IsCompleted) 
    { 
     ShowTaskCommandAction?.Invoke(); 
    } 
} 
} 
+0

Welches Problem tritt bei der Bindung von SelectedItem auf? Irgendwelche Kompilierungs- oder Laufzeitfehler? Oder wird 'SelectedTask' gerade gesetzt? – Plac3Hold3r

+0

Ich hatte eine NullReferenceException. Die Eigenschaft SelectedTask in ViewModel ist null. –

+0

Könnten Sie bitte den Teil Ihres ViewModel mit 'SelectedItem',' ShowTaskCommand' und wo die NullReferenceException auftritt? – Plac3Hold3r

Antwort

0

Ich glaube, es hat mit dem Timing der ShowTaskCommand zu tun gegen den Satz von SelectedTask ausgeführt zu werden. Also, wenn Sie den Code innerhalb ExecuteShowTaskCommand auskommentierten und einen Haltepunkt in ExecuteShowTaskCommand sowie den Satz von SelectedTask platzieren, würden Sie feststellen, dass der ExecuteShowTaskCommand zuerst ausgeführt wird und dann der Satz der SelectedTask.


Alternative Implementierung

Um das Timing-Problem zu vermeiden Sie können stattdessen die ausgewählte Aufgabe in Ihren Befehl als Parameter übergeben.

MvxCommand<Task> _showTaskCommand; 
public MvxCommand<Task> ShowTaskCommand => 
    _showTaskCommand ?? (_showTaskCommand = new MvxCommand<Task>(ExecuteShowTaskCommand)); 

private void ExecuteShowTaskCommand(Task selectedTask) 
{ 
    if (!selectedTask.IsCompleted) 
    { 
     ShowTaskCommandAction?.Invoke(); 
    } 
} 
Verwandte Themen