考虑下面这个简单的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),
}
}为什么这总是在DoShowInStoreCommand的url参数中给我null?当绑定Elements时,我如何使用命令参数?
编辑:
我尝试了以下方法,因为Slodge在他的答案中写的东西与任何扩展方法签名都不匹配,但是当它试图绑定时,它给了我错误:
new StringElement("Show in App Store")
.Bind(bindings, "SelectedCommand CommandParameter(ShowInStoreCommand, TouchStoreUrl)")错误:
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 发布于 2014-03-07 20:35:10
您在以下位置创建的绑定:
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)")https://stackoverflow.com/questions/22250081
复制相似问题