我有2 ViewModels
(ConfigurationViewModel
和EditConfigurationViewModel
)。在ConfigurationViewModel
我得到了以下代码:
public ConfigurationViewModel()
{
NewConfigCommand = new MvxRelayCommand(DoNewConfig);
EditConfigCommand = new MvxRelayCommand<ConfigurationSet>(DoEditConfig);
}
private void DoNewConfig()
{
this.RequestNavigate<EditConfigurationViewModel>();
}
private void DoEditConfig(ConfigurationSet config)
{
this.RequestNavigate<EditConfigurationViewModel>(new { id = config.Id.ToString() });
}
在EditConfigurationViewModel中,我得到了以下代码:
public EditConfigurationViewModel()
{
Configuration = new ConfigurationSet();
}
public EditConfigurationViewModel(string id)
{
Configuration = ConfigDataStore.GetConfiguration(Guid.Parse(id));
}
我想要实现的是非常简单的事情......在ConfigurationViewModel
被解雇NewConfigCommand
时,我想导航到EditConfigurationViewModel
,并使用无参数构造函数。当EditConfigCommand
被触发时,我想使用接收string
的构造函数。
这段代码的问题在于,无论触发什么命令,都会使用无参数构造函数,代码永远不会到达其他构造函数。
我做了一些实验,删除了无参数构造函数,结果是调用了另一个构造函数,我得到EditConfigurationCommand
的预期结果,但是如果我尝试触发NewConfigurationCommand
由于无参数构造函数的存在性(迄今为止很好),因此抛出异常。
不幸的是,此刻我没有安装VS2010,所以我无法通过PCL代码进行调试......我做了一些“眼睛调试”并找到了这个类MvxViewModelLocator
。我认为问题出在这里。可能在DoLoad
方法中尝试获取MethodInfo
...
此时我只是想知道我做错了什么或者这是否是预期的结果。与此同时,我想我会抓住机会安装VS2010并祈祷它不会破坏任何东西......
答案 0 :(得分:4)
关于PCL调试问题,为什么不添加Win8或WP7 / 8用户界面 - 然后你可以通过PCL代码进行调试......
关于主要问题 - 关于如何使用多个构造函数......我建议你不要。
对我来说,edit和new是两个不同的视图和两个不同的视图模型 - 它们可以共享公共属性和公共布局 - 但这可以使用继承,使用UserControls,使用include
axml等来实现。
有关我通常用于新内容和编辑的示例,请参阅https://github.com/slodge/MvvmCross/tree/vnext/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/ViewModels
如果你坚持继续使用一个视图模型,那么你可以考虑使用New的“魔术值” - 例如如果Guid.Empty被传递那么这意味着新的?
或者,您可以放弃无参数构造函数,并可以向第二个添加默认值:
public EditConfigurationViewModel(string id = null)
{
Guid value;
if (id == null || !Guid.TryParse(id, out value))
{
Configuration = new ConfigurationSet();
}
else
{
Configuration = ConfigDataStore.GetConfiguration(value);
}
}
我认为那会有效吗?
最后,如果这些都不适合您,那么您可以考虑重写ViewModel构造机制。
为了帮助解决这个问题,最近有一篇关于如何为MvvmCross编写自己的默认ViewModelLocator的相当详细的帖子 - 请参阅http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html
使用这种方法,您可以创建更多自定义导航模型 - 或者如果这是唯一的特殊视图模型,那么我怀疑您可以创建默认的viewModelLocator,如:
public class MyViewModelLocator
: MvxDefaultViewModelLocator
{
public override bool TryLoad(Type viewModelType, IDictionary<string, string> parameterValueLookup,
out IMvxViewModel model)
{
if (viewModelType == typeof(EditConfigurationViewModel))
{
string id;
if (parameterValueLookup.TryGetValue("id", out id))
{
model = new EditConfigurationViewModel(id);
}
else
{
model = new EditConfigurationViewModel();
}
return true;
}
return base.TryLoad(viewModelType, parameterValueLookup, IMvxViewModel model);
}
}
使用以下命令在App.cs中注册该定位器:
protected override IMvxViewModelLocator CreateDefaultViewModelLocator()
{
return new MyViewModelLocator();
}