考虑这个简单的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)")
答案 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)")