C# MVVMCross将值传递给具有2个构造函数的ViewModel

C# MVVMCross将值传递给具有2个构造函数的ViewModel,c#,variables,constructor,mvvmcross,C#,Variables,Constructor,Mvvmcross,我有两个ViewModels(ConfigurationViewModel和EditConfigurationViewModel)。在ConfigurationViewModel中,我得到了以下代码: public ConfigurationViewModel() { NewConfigCommand = new MvxRelayCommand(DoNewConfig); EditConfigCommand = new MvxRelayComman

我有两个
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() });
    }
    public EditConfigurationViewModel()
    {
        Configuration = new ConfigurationSet();
    }

    public EditConfigurationViewModel(string id)
    {
        Configuration = ConfigDataStore.GetConfiguration(Guid.Parse(id));
    }
我想要实现的是一件非常简单的事情。。。在
ConfigurationViewModel
中,当启动
NewConfigCommand
时,我想导航到
EditConfigurationViewModel
,并使用无参数构造函数。当启动
EditConfigCommand
时,我想使用接收
字符串的构造函数

这段代码的问题是,无论触发什么命令,都始终使用无参数构造函数,并且代码永远不会到达其他构造函数

我做了一些实验,通过删除无参数构造函数,结果是调用了另一个构造函数,我得到了
EditConfigurationCommand
的预期结果,但是如果我尝试触发
NewConfigurationCommand
,由于无参数构造函数的不存在,也会引发异常(到目前为止还不错)

不幸的是,目前我还没有安装VS2010,所以我无法通过PCL代码进行调试…我做了一些“眼睛调试”,发现了这个类
MvxViewModelLocator
。我想问题就在这里。当它试图获取
MethodInfo
时,可能在
DoLoad
方法中


在这一点上,我只是想知道我是否做错了什么,或者这是预期的结果。同时,我想我会抓住机会安装VS2010,祈祷它不会破坏任何东西…

关于PCL调试问题,为什么不添加一个Win8或WP7/8 UI-然后你可以通过PCL代码进行调试


关于主要问题——关于如何使用多个构造函数……我建议您不要使用

对我来说,“编辑”和“新建”是两个不同的视图和两个不同的视图模型-它们可能共享公共属性和公共布局-但这可以通过使用继承、使用用户控件、使用
include
axml等来实现

有关我通常用于新建和编辑的示例,请参见


如果你坚持继续使用一个VIEW模型,那么你可以考虑使用一个新的“魔法值”——例如GUID。空的通过,那么这意味着新的?


或者,您可以删除无参数构造函数,并向第二个构造函数添加默认值:

public EditConfigurationViewModel(string id = null)
{
    Guid value;
    if (id == null || !Guid.TryParse(id, out value))
    {
        Configuration = new ConfigurationSet();
    }
    else
    {
        Configuration = ConfigDataStore.GetConfiguration(value);
    }
}
我想这样行吗


最后,如果这些都不适合你,那么你可以考虑覆盖VIEWMD构建机制。

为了对此有所帮助,最近有一篇相当详细的文章介绍了如何为MvvmCross编写自己的默认ViewModelLocator-请参阅

使用这种方法,您可以创建更自定义的导航模型,或者如果这是唯一的特殊视图模型,那么我怀疑您可以创建默认的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);
    }
}

像往常一样,一个非常详细的回答:)谢谢你的帮助。在这种情况下,我将只使用构造函数中的默认值并删除无参数值。。。将来在更复杂的场景中,如果可以的话,我将使用继承和/或ViewModel costumization。我刚刚尝试在EditConfigurationViewModel
公共EditConfigurationViewModel(string id=null)
中使用默认值的构造函数。当我尝试导航到此ViewModel时,会引发一个异常:cirriary.MvvmCross.Exceptions.MvxException:无法加载ViewModel我已经弄明白了。尝试使用具有默认值的构造函数时出现问题。由于某些原因,ViewModel加载失败。在重新安排开发环境以调试PCL代码之后,我可以看一看……如果失败了,那么只需使用Guid.Empty作为特殊id—它只是C#::)
protected override IMvxViewModelLocator CreateDefaultViewModelLocator()
{
     return new MyViewModelLocator();
}