Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin MvvmCross-如何在iOS TableView中绑定到SelectedItem?_Xamarin_Xamarin.ios_Mvvmcross_Xamarin Binding - Fatal编程技术网

Xamarin MvvmCross-如何在iOS TableView中绑定到SelectedItem?

Xamarin MvvmCross-如何在iOS TableView中绑定到SelectedItem?,xamarin,xamarin.ios,mvvmcross,xamarin-binding,Xamarin,Xamarin.ios,Mvvmcross,Xamarin Binding,我在iOS中有一个TableView,在我的ViewModel中,我有一个TableView中选定项的属性,但我不知道如何为该属性绑定选定项。我该怎么做?我的项目是跨平台的。我有一个Android项目和一个iOS项目。在Android项目中,我进行了绑定: <Mvx.MvxListView android:id="@+id/lstViewTasks" android:layout_width="fill_par

我在iOS中有一个TableView,在我的ViewModel中,我有一个TableView中选定项的属性,但我不知道如何为该属性绑定选定项。我该怎么做?我的项目是跨平台的。我有一个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();

}
[注册(“ProjectMyTasksViewc”)]
公共类项目MyTasksView:MvxTableViewController
{
//其他事情
var source=new MvxSimpleTableViewSource(TableView、ProjectMyTasksItem.Key、ProjectMyTasksItem.Key);
TableView.Source=Source;
this.CreateBinding(source).To(viewModel=>viewModel.Tasks).Apply();
this.CreateBinding(source).For(s=>s.SelectedItem).To(viewModel=>viewModel.SelectedTask.Apply();
this.CreateBinding(source).For(tableSource=>tableSource.SelectionChangedCommand).To(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();
    }
}  
}
公共类项目mytasksviewmodel:MvxViewModel
{
公共操作ShowTaskCommandAction{get;set;}
私人IList_任务;
公共IList任务
{
获取{return\u tasks;}
设置{u tasks=value;RaisePropertyChanged(()=>tasks);}
}
私人任务_选择任务;
公共任务选择任务
{
获取{return\u selectedTask;}
设置{u selectedTask=value;RaisePropertyChanged(()=>selectedTask);}
}
专用MvxCommand\u showtask命令;
公共MvxCommand showtask命令
{
得到
{
_showTaskCommand=_showTaskCommand??(_showTaskCommand=new MvxCommand(ExecuteShowTaskCommand));
返回showtask命令;
}
}
私有void ExecuteShowTaskCommand()
{
如果(!SelectedTask.IsCompleted)
{
ShowTaskCommandAction?.Invoke();
}
}  
}

我认为这与执行
showtask命令的时间有关,而不是与
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();
    }
}
MvxCommand\u showtask命令;
公共MvxCommand ShowTaskCommand=>
_showtask命令??(_showTaskCommand=new MvxCommand(ExecuteShowTaskCommand));
私有void executeshowtask命令(任务选择任务)
{
如果(!selectedTask.IsCompleted)
{
ShowTaskCommandAction?.Invoke();
}
}

我认为这与执行
showtask命令的时间有关,而不是与
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();
    }
}
MvxCommand\u showtask命令;
公共MvxCommand ShowTaskCommand=>
_showtask命令??(_showTaskCommand=new MvxCommand(ExecuteShowTaskCommand));
私有void executeshowtask命令(任务选择任务)
{
如果(!selectedTask.IsCompleted)
{
ShowTaskCommandAction?.Invoke();
}
}

您在使用
SelectedItem
绑定时遇到了什么问题?有编译或运行时错误吗?或者是
SelectedTask
set刚刚被击中?我遇到了一个NullReferenceException。ViewModel中SelectedTask的属性为null。请将ViewModel的部分包含在
SelectedItem
ShowTaskCommand
中,以及NullReferenceException‌发生在?我编辑了询问。我把ViewModel代码放进去了。如果(!SelectedTask.IsCompleted),则行中的ExecuteShowTaskCommand方法会发生NullReferenceException。此时,SelectedTask为空。您在使用
SelectedItem
绑定时遇到了什么问题?有编译或运行时错误吗?或者是
SelectedTask
set刚刚被击中?我遇到了一个NullReferenceException。ViewModel中SelectedTask的属性为null。请将ViewModel的部分包含在
SelectedItem
ShowTaskCommand
中,以及NullReferenceException‌发生在?我编辑了询问。我把ViewModel代码放进去了。如果(!SelectedTask.IsCompleted),则行中的ExecuteShowTaskCommand方法会发生NullReferenceException。此时,SelectedTask为空。