DialogViewController中的CommandParameter绑定

时间:2014-03-07 12:26:58

标签: xamarin.ios mvvmcross

考虑这个简单的ViewModel

public class AboutViewModel
    : MvxViewModel
{
    private readonly IMvxWebBrowserTask _webBrowserTask;
    public AboutViewModel(IMvxWebBrowserTask webBrowserTask) { _webBrowserTask = webBrowserTask; }

    private MvxCommand<string> _showInStoreCommand;
    public ICommand ShowInStoreCommand
    {
        get
        {
            _showInStoreCommand = _showInStoreCommand ?? new MvxCommand<string>(DoShowInStoreCommand);
            return _showInStoreCommand;
        }
    }

    private void DoShowInStoreCommand(string url)
    {
        _webBrowserTask.ShowWebPage(url);
    }

    public string Wp8StoreUrl
    {
        get { return "http://windowsphone.com/s?appId=myappid"; }
    }

    public string AndroidStoreUrl
    {
        get { return "https://play.google.com/store/apps/details?id=mypackagename"; }
    }

    public string TouchStoreUrl
    {
        get { return "http://itunes.com"; }
    }
}

我想在MvxDialogViewController中绑定,我写的是这样的:

Root = new RootElement
{
    new Section()
    {
        new StringElement("Show in App Store").Bind(bindings, e => e.SelectedCommand, vm => vm.ShowInStoreCommand, new MvxCommandParameterValueConverter(), ViewModel.TouchStoreUrl),
    }
}

为什么这总是在null的{​​{1}}参数中给我DoShowInStoreCommand?绑定url时如何使用命令参数?

编辑:

我尝试了以下内容,因为Slodge在他的回答中所写的内容与任何Extension方法签名都不匹配,但它在尝试绑定时给出了错误:

Element

错误:

 new StringElement("Show in App Store")
                .Bind(bindings, "SelectedCommand CommandParameter(ShowInStoreCommand, TouchStoreUrl)")

1 个答案:

答案 0 :(得分:0)

您创建的绑定:

    new StringElement("Show in App Store").Bind(
                                  bindings, 
                                  e => e.SelectedCommand, 
                                  vm => vm.ShowInStoreCommand, 
                                 new MvxCommandParameterValueConverter(), ViewModel.TouchStoreUrl),

是对ViewModel上的表达式vm => vm.ShowInStoreCommand的绑定,但它捕获当前值ViewModel.TouchStoreUrl

如果你想在MvvmCross中使用MultiBinding,那么你可以使用Tibet扩展名来执行此操作(请参阅https://github.com/MvvmCross/MvvmCross/wiki/Databinding) - 但这些在流利的表达式语法中无法轻松访问 - 相反,你必须改为使用基于字符串的语法。

所以这种绑定可以通过以下方式实现:

    new StringElement("Show in App Store").Bind(
                                  bindings, 
                                  e => e.SelectedCommand, 
                                  "CommandParameter(ShowInStoreCommand, TouchStoreUrl)")