【问题标题】:Xamarin.IOS : MVVMCross Passing parameter from view to ViewModelXamarin.IOS:MVVMCross 将参数从视图传递到 ViewModel
【发布时间】:2017-05-12 21:54:41
【问题描述】:

我正在为我的 xamarin ios 项目使用 MVVMCross。从我的自定义单元格视图中,我想将一个参数传递给它的视图模型。可以使用 MVVMCross 吗?

我尝试使用 CommandParameter 属性,但它不起作用。是否可以将参数从视图传递到视图模型,如果可以,有人可以提供一个 sn-p 吗?

谢谢

更新

我的单元格有按钮并且在按钮单击时我想知道被单击的按钮的单元格索引以执行操作。我正在使用以下代码来做到这一点。

this.DelayBind(() =>
{
    var bSet = this.CreateBindingSet<MyeCell, SomeViewModel>();
    bSet.Bind(cellIndex).To(vm => vm.index);
    bSet.Bind(UserPostBtn).To(vm => vm.EditPhotoCommand);
    bSet.Apply();
});

我尝试使用 delaybind 连接视图和视图模型,但在单击按钮时出现以下错误:

提供给 CFRunLoopRunSpecific 的无效模式“kCFRunLoopCommonModes” - 中断 _CFRunLoopError_RunCalledWithInvalidMode 以进行调试。此消息每次执行只会出现一次。

【问题讨论】:

  • 是否要在单击单元格时传递参数?您能否提供一些代码,以便我们可以看到您想要传递给视图模型的内容。
  • 我更新了我的问题@Plac3Hold3r

标签: c# xamarin xamarin.ios mvvmcross


【解决方案1】:

您应该能够通过使用MvxCommandParameterValueConverter 的命令将参数传递给您的ViewModel

字符串命名方式:

bSet
    .Bind(UserPostBtn)
    .To(vm => vm.EditPhotoCommand)
    .WithConversion("CommandParameter", cellIndex);

类型化名称方法:

bSet
    .Bind(UserPostBtn)
    .To(vm => vm.EditPhotoCommand)
    .WithConversion(new MvxCommandParameterValueConverter(), cellIndex);

扩展方法途径:

bSet
    .Bind(MainButton)
    .To(vm => vm.EditPhotoCommand)
    .CommandParameter(cellIndex);

然后在您的 ViewModel 中接收传递的参数。

IMvxCommand _editPhotoCommand;
public IMvxCommand EditPhotoCommand =>
    _editPhotoCommand ?? (_editPhotoCommand = new MvxCommand<int>(EditPhotoExecution));

private void EditPhotoExecution(int index)
{
    // do stuff
}

更新:

MvvmCross 还提供了一个扩展方法CommandParameter,它允许您只传入命令参数,它会处理MvxCommandParameterValueConverter 的创建。

【讨论】:

    【解决方案2】:

    请查看official documentation for MvvmCross 以及如何使用 UITableViews 和 UITableViewCells。

    基本上,您的MvxTableViewSource 子类会收到有关选择了哪个单元格的通知。现在只需检查您的模型并匹配索引...

    如果您需要知道在单元格中输入了什么文本或切换了开关,您应该考虑在单元格子类和单元格源之间使用绑定。确保在你的 UITableViewCell 子类中使用DelayBind

    【讨论】:

    • 我使用了DelayBind,但是当我点击按钮时出现错误invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
    • 您不应该直接将其绑定到视图模型,而是绑定到您的源代码。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2022-01-21
    • 2017-01-24
    相关资源
    最近更新 更多