2016-08-12 4 views
1

У меня есть TableView в iOS, и в моей модели ViewModel у меня есть свойство для выбранного элемента в TableView, но я не знаю, как связать выбранный элемент для этого свойства. Как я могу это сделать? Мой проект является кросс-платформенным. У меня есть проект Android и проект iOS. В Android-проекте я сделал привязку:MvvmCross - как связать с SelectedItem в iOS TableView?

<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" /> 

, но я не могу выполнить эквивалентную привязку в iOS.

Это мой TableViewController:

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

} 

Вот мой 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

В какой проблеме вы столкнулись с привязкой 'SelectedItem'? Любые ошибки компиляции или времени выполнения? Или набор 'SelectedTask' только что попал? – Plac3Hold3r

+0

У меня было исключение NullReferenceException. Свойство SelectedTask в ViewModel равно null. –

+0

Не могли бы вы включить часть ViewModel с 'SelectedItem',' ShowTaskCommand' и где возникает NullReferenceException? – Plac3Hold3r

ответ

0

Я считаю, что он должен делать с синхронизацией вашего ShowTaskCommand получения выполненного против множества SelectedTask. Поэтому, если вы прокомментировали код внутри ExecuteShowTaskCommand и разместите точку останова внутри ExecuteShowTaskCommand, а также набор SelectedTask, вы должны найти, что ExecuteShowTaskCommand работает первым, а затем набор SelectedTask.


Альтернативная реализация

Чтобы избежать проблемы синхронизации вы можете вместо того, чтобы передать выбранную задачу в вашей команде в качестве параметра.

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

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