Xamarin.ios DialogViewController中的CommandParameter绑定
考虑这个简单的Xamarin.ios DialogViewController中的CommandParameter绑定,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,考虑这个简单的ViewModel: public class AboutViewModel : MvxViewModel { private readonly IMvxWebBrowserTask _webBrowserTask; public AboutViewModel(IMvxWebBrowserTask webBrowserTask) { _webBrowserTask = webBrowserTask; } private MvxCommand<
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"; }
}
}
为什么在DoShowInStoreCommand
的url
参数中总是给我null
?绑定元素时如何使用命令参数
编辑:
我尝试了以下方法,因为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
您在中创建的绑定:
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中使用多重绑定,那么可以使用zida
扩展名(请参阅)来实现这一点,但是这些扩展名在流畅的表达式语法中很难访问,因此您必须使用基于字符串的语法
因此,这种绑定可以通过以下方式实现:
new StringElement("Show in App Store").Bind(
bindings,
e => e.SelectedCommand,
"CommandParameter(ShowInStoreCommand, TouchStoreUrl)")
new StringElement("Show in App Store").Bind(
bindings,
e => e.SelectedCommand,
"CommandParameter(ShowInStoreCommand, TouchStoreUrl)")