2016-08-12 7 views
1

私はTableViewをiOSに持っていて、私の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だ

:ここ

[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を持っています。 ViewModelのSelectedTaskプロパティはnullです。 –

+0

ViewModelの一部に 'SelectedItem'、' ShowTaskCommand'、そしてNullReferenceExceptionがどこに含まれていますか? – Plac3Hold3r

答えて

0

私はそれがSelectedTask一連の対実行取得あなたのShowTaskCommandのタイミングと関係していると信じています。したがって、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(); 
    } 
} 
関連する問題