Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/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
尝试用ICommands理解MvvM模式中的列表选择(无特定框架)_Mvvm_Icommand - Fatal编程技术网

尝试用ICommands理解MvvM模式中的列表选择(无特定框架)

尝试用ICommands理解MvvM模式中的列表选择(无特定框架),mvvm,icommand,Mvvm,Icommand,首先请注意,我不是指任何特定的框架或技术,如XAML。 问题是如何使用ICommand实现MvvM模式来选择列表中的项目(=单击一行) 我有一个视图模型(伪代码): 类ListViewModel { //列表中的项目。 公开可见的收集项目{}; //用于项目选择的命令。 公共ICommand ItemSelectedCommand { ... } //在列表中选择一个项目。 public void SelectItem(整数索引) { ... } //当前选定的项目。 公共T选择项 { 获取{…

首先请注意,我不是指任何特定的框架或技术,如XAML。 问题是如何使用
ICommand
实现MvvM模式来选择列表中的项目(=单击一行)

我有一个视图模型(伪代码):

类ListViewModel
{
//列表中的项目。
公开可见的收集项目{};
//用于项目选择的命令。
公共ICommand ItemSelectedCommand
{
...
}
//在列表中选择一个项目。
public void SelectItem(整数索引)
{
...
}
//当前选定的项目。
公共T选择项
{
获取{…};
}
}
我现在如何“手动”将UI连接到该视图模型?例如,在iOS应用程序中。 我可能会有一个
UITableViewController
,获取视图模型的实例并从中填充
UITableView
内容。然后我将从
RowSelected()
方法触发
ICommand
。 我不明白的是:视图模型现在如何知道选择了哪个项索引?我不想调用
SelectItem()
,因为这样我就根本不需要松散耦合的
ICommand

也许在这里,我们必须看看它是如何在XAML中解决的,才能理解这个诀窍?

来自XAML和WPF,有两个选项可以将选择更改从UI转发到ViewModel(我理解您的问题,您不是在问另一种方法-将ViewModel中的更改反馈到UI-这里):

带有效负载的命令

ICommand
s
Execute
方法有一个有效负载参数。在没有有效负载的情况下执行命令可以通过传递null来完成:

SomeCommand.Execute(null);
在您的情况下,将所选项目作为事件处理程序中的参数传递是有意义的:

vm.ItemSelectedCommand.Execute(eventArgs.SelectedItem);

在命令的执行方法中,可以处理参数。请注意,此处不直接涉及ViewModel属性
SelectedItem
。如果您明确需要所选索引(通常情况下并非如此),我会在
Items
集合中检查所选项目的索引

将列表的选定项绑定到ViewModel属性

选项B是将列表中的选定项“绑定”到ViewModel上的不同属性,在您的情况下,是列表事件处理程序中的SelectedItem属性:

vm.SelectedItem = myList.SelectedItem;
尽管在ViewModel上设置SelectedItem后可以在没有有效负载的情况下调用该命令,但该命令有点多余。我更愿意在ViewModel的属性的集合访问器中处理所选项的更改


注意:XAML和WPF附带了大量现成的基础结构代码。如果没有适当的框架以松散耦合的方式实际处理绑定UI和ViewModels,MVVM就没有意义。你很快就会得到很多额外的工作和很少的好处,因为你仍然保持着紧密的依赖关系。一句话:我建议在实际实现之前,先获得或编写一个合适的MVVM框架。

同时我注意到了有效负载参数。事实上,我忘了!像你建议的那样现在实施。
vm.ItemSelectedCommand.Execute(myList.SelectedItem);
vm.SelectedItem = myList.SelectedItem;