1

iOS に TableView があり、ViewModel に TableView の Selected Item のプロパティがありますが、Selected Item をこのプロパティにバインドする方法がわかりません。どうやってやるの?私のプロジェクトはクロスプラットフォームです。Android プロジェクトと iOS プロジェクトがあります。Android プロジェクトでは、バインドを行いました。

<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();
    }
}  
}
4

1 に答える 1

0

私はそれがあなたのShowTaskCommand処刑のタイミングとセットのセットに関係していると信じていますSelectedTask。したがって、内部のコードをコメントアウトしてExecuteShowTaskCommandブレークポイントを配置するExecuteShowTaskCommandと、 のセットと同様に、が最初に実行され、次に のセットが実行さSelectedTaskれていることがわかります。ExecuteShowTaskCommandSelectedTask


代替実装

タイミングの問題を回避するには、選択したタスクをパラメーターとしてコマンドに渡すことができます。

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

private void ExecuteShowTaskCommand(Task selectedTask)
{
    if (!selectedTask.IsCompleted)
    {
        ShowTaskCommandAction?.Invoke();
    }
}
于 2016-08-15T16:21:27.103 に答える