尝试用ICommands理解MvvM模式中的列表选择(无特定框架)
首先请注意,我不是指任何特定的框架或技术,如XAML。 问题是如何使用尝试用ICommands理解MvvM模式中的列表选择(无特定框架),mvvm,icommand,Mvvm,Icommand,首先请注意,我不是指任何特定的框架或技术,如XAML。 问题是如何使用ICommand实现MvvM模式来选择列表中的项目(=单击一行) 我有一个视图模型(伪代码): 类ListViewModel { //列表中的项目。 公开可见的收集项目{}; //用于项目选择的命令。 公共ICommand ItemSelectedCommand { ... } //在列表中选择一个项目。 public void SelectItem(整数索引) { ... } //当前选定的项目。 公共T选择项 { 获取{…
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
sExecute
方法有一个有效负载参数。在没有有效负载的情况下执行命令可以通过传递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;