首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DialogViewController中的CommandParameter绑定

DialogViewController中的CommandParameter绑定
EN

Stack Overflow用户
提问于 2014-03-07 20:26:58
回答 1查看 271关注 0票数 0

考虑下面这个简单的ViewModel

代码语言:javascript
复制
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中,然后我写成这样:

代码语言:javascript
复制
Root = new RootElement
{
    new Section()
    {
        new StringElement("Show in App Store").Bind(bindings, e => e.SelectedCommand, vm => vm.ShowInStoreCommand, new MvxCommandParameterValueConverter(), ViewModel.TouchStoreUrl),
    }
}

为什么这总是在DoShowInStoreCommandurl参数中给我null?当绑定Elements时,我如何使用命令参数?

编辑:

我尝试了以下方法,因为Slodge在他的答案中写的东西与任何扩展方法签名都不匹配,但是当它试图绑定时,它给了我错误:

代码语言:javascript
复制
 new StringElement("Show in App Store")
                .Bind(bindings, "SelectedCommand CommandParameter(ShowInStoreCommand, TouchStoreUrl)")

错误:

代码语言:javascript
复制
MvxBind: Error:   2.37 Problem parsing Lang binding MvxException: Must follow binding option CommandParameter with an '=' in SelectedCommand CommandParameter(ShowInStoreCommand, TouchStoreUrl)
      at Cirrious.MvvmCross.Binding.Parse.Binding.MvxBindingParser.ParseEquals (System.String block) [0x0003c] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\MvxBindingParser.cs:83 
  at Cirrious.MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseNextBindingDescriptionOptionInto (Cirrious.MvvmCross.Binding.Parse.Binding.MvxSerializableBindingDescription description) [0x0019a] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:56 
  at Cirrious.MvvmCross.Binding.Parse.Binding.Tibet.MvxTibetBindingParser.ParseNextBindingDescriptionOptionInto (Cirriou
s.MvvmCross.Binding.Parse.Binding.MvxSerializableBindingDescription description) [0x00033] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\Tibet\MvxTibetBindingParser.cs:49 
  at Cirrious.MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseBindingDescription (ParentIsLookingForComma parentIsLookingForComma) [0x00014] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:176 
  at Cirrious.MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseBindingDescription () [0x00001] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:159 
  at Cirrious.MvvmCross.Binding.Parse.Binding.MvxBindingParser.ParseTargetPropertyNameAndDescription () [0x0000f] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\MvxBindingParser.cs:72 
  at Cirrious.MvvmCross.Binding.Parse.Binding.MvxBindingParser.TryParseBindingSpecification (System
.String text, Cirrious.MvvmCross.Binding.Parse.Binding.MvxSerializableBindingSpecification& requestedBindings) [0x0001a] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Parse\Binding\MvxBindingParser.cs:51 
EN

回答 1

Stack Overflow用户

发布于 2014-03-07 20:35:10

您在以下位置创建的绑定:

代码语言:javascript
复制
    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)来实现-但是这些扩展在流畅的表达式语法中不容易访问-相反,您必须使用基于字符串的语法。

因此,这种绑定可以使用如下命令来实现:

代码语言:javascript
复制
    new StringElement("Show in App Store").Bind(
                                  bindings, 
                                  e => e.SelectedCommand, 
                                  "CommandParameter(ShowInStoreCommand, TouchStoreUrl)")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22250081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档