2016-08-12 4 views
1

iOS에 TableView가 있고 ViewModel에서 TableView의 Selected Item에 대한 속성을 가지고 있지만이 속성에 대해 Selected Item을 바인딩하는 방법을 모르겠습니다. 어떻게해야합니까? 내 프로젝트는 크로스 플랫폼입니다. Android 프로젝트와 iOS 프로젝트가 있습니다. Android 프로젝트에서 바인드를 수행했습니다.MvvmCross - iOS TableView에서 SelectedItem에 바인딩하는 방법?

<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 있다는 : 나는 SelectedTask 세트 대 실행하기 당신의 ShowTaskCommand의 타이밍과 관련이있다 생각

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이 발생했습니다. ViewModel의 SelectedTask 속성이 null입니다. –

+0

ViewModel의 일부를'SelectedItem','ShowTaskCommand' 그리고 NullReferenceException이 발생하는 곳에 포함시켜 주시겠습니까? – Plac3Hold3r

답변

0

:

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

} 

가 여기 내 뷰 모델이다. 따라서 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(); 
    } 
} 
관련 문제