如何使用MVVM Light将guid参数传递给silverlight 4中的viewmodel构造函数

如何使用MVVM Light将guid参数传递给silverlight 4中的viewmodel构造函数,mvvm,silverlight-4.0,mvvm-light,Mvvm,Silverlight 4.0,Mvvm Light,我需要向viewmodel构造函数传递一个id。此id是外部id,它被传递到包含silverlight应用程序的网页。我使用的是MVVM轻型框架。 我已经看过几篇关于向viewmodel传递参数的文章,但在所有这些文章中,参数都是全局的,或者可以不使用参数进行实例化。 在我的例子中,我需要viewmodel的构造函数中有一个GUID id,它是从另一个应用程序传递的 编辑: 这是定位器的代码: public class ViewModelLocator { public static I

我需要向viewmodel构造函数传递一个id。此id是外部id,它被传递到包含silverlight应用程序的网页。我使用的是MVVM轻型框架。 我已经看过几篇关于向viewmodel传递参数的文章,但在所有这些文章中,参数都是全局的,或者可以不使用参数进行实例化。 在我的例子中,我需要viewmodel的构造函数中有一个GUID id,它是从另一个应用程序传递的

编辑:

这是定位器的代码:

public class ViewModelLocator
{
    public static IUnityContainer Container
    {
        get;
        private set;
    }

    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator(Guid id)
    {
        Container = new UnityContainer();
    }


    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup()
    {
        Container.Resolve<CautelaVM>().Cleanup();
    }


    #region Cautela Inventário

    public CautelaVM CautelaInventario
    {
        get
        {
            return Container.Resolve<CautelaVM>();
        }
    }

    #endregion
}
公共类ViewModelLocator
{
公共静态IUnityContainer容器
{
得到;
私人设置;
}
/// 
///初始化ViewModelLocator类的新实例。
/// 
公共ViewModelLocator(Guid id)
{
容器=新的UnityContainer();
}
/// 
///清理所有资源。
/// 
公共静态无效清除()
{
Container.Resolve().Cleanup();
}
#尾侧区
公共尾静脉
{
得到
{
返回Container.Resolve();
}
}
#端区
}
定位器被传递到视图中的DataContext,如下所示:

DataContext=“{Binding Source={StaticResource Locator}”

编辑2:

现在它可以工作了。这是我在视图ctor中添加的代码,用于注册要在VM ctor中使用的GUID:

ViewModel.ViewModelLocator.Container.RegisterType<CautelaVM>(new InjectionConstructor(id));
ViewModel.ViewModelLocator.Container.RegisterType(新注入构造函数(id));
通过使用工厂。您将定义工厂界面,如下所示:

public interface IFooViewModelFactory
{
    IFooViewModel Create(Guid guid);
}
然后将设备添加到Windsor配置中:

kernel.AddFacility<TypedFactoryFacility>();
kernel.Register(
                Component.For<IFooViewModelFactory>()
                         .AsFactory()
               );
请注意,Windsor提供的是工厂的实现,而不是您。此外,工厂通过名称将构造函数中的参数与
Create
方法参数匹配,因此请确保
FooViewModel
构造函数匹配,例如:

public class FooViewModel
{
    // "Guid guid" matches IFooViewModelFactory.Create(Guid guid)
    public FooViewModel(Guid guid)
    {
        // ...
    }
}

如果您使用的是MVVM light和
ViewModelLocator
,您可以将GUID传递给它。一旦定位器知道GUID,您就可以将其注册到
SimpleIoc
,并将其用作依赖项。

为什么不能使用属性注入?我不知道如何做。您能为我指出正确的方向吗?我在ilverlight和/或MVVM。它与MVVM无关。首先构造对象,然后使用属性或初始化(guid)设置guid method@dan根据您的见解,我一直在研究这个问题,到目前为止,我就是这样。我的viewmodel具有Id属性,并且我还有一个设置Id的RelayCommand。现在我尝试将此命令绑定到视图的onload,以便它在加载时设置viewmodel的Id。我想这就是您指向我的地方。现在问题是如何将参数传递给RelayCommand。参数id来自包含silverlight的网页。我如何从视图获取id到viewmodel,仍然保持两者完全解耦?我的答案是什么?他没有提到温莎,我错了吗?无论如何,工厂的想法可能有助于解决问题purpose@dan哇,你说得对,真丢脸。我想我花了太多时间在我自己的标记集上了!我不知道什么是Windsor或类型化工厂设施,可能是UnityContainer之类的容器?但无论如何,我仍然不知道如何将Id从视图获取到viewmodel。@budahead使用MVVM light SimpleIoc。注册GUID,您可以将其用作y中的依赖项我们的虚拟机是一个IOC容器,类似于Unity。如果您没有使用IOC容器,那么您可以忽略我的答案。如果您使用IOC容器,您的IOC容器中应该有一个类似的构造。请记住,您试图从视图的视图模型而不是视图本身获取Guid。视图可以向MVVM lightI的SimpleIoc注册Guidng MVVM light和ViewModelLocator,但使用UnityContainer。我认为两者都可以工作,对吗?如果我理解,我应该让ViewModelLocator的构造函数接收GUID参数。我如何在视图中注册GUID。在代码隐藏中?它不会被绑定吗?我认为绑定在这里没有任何用处。当您读取GUID时,请传递它对于您选择的定位器或IoC容器。对我来说,这似乎是一个简单而有效的解决方案。也许可以更详细地解释一下您是如何获得GUIDI的,当您最初谈到属性注入时,您认为这就是您指给我的。很抱歉,我对所有这些都有点困惑。如果我在定位器构造中添加GUID或者,当它运行时,我会收到异常“在ViewModel.ViewModelLocator类型上找不到匹配的构造函数”
public class FooViewModel
{
    // "Guid guid" matches IFooViewModelFactory.Create(Guid guid)
    public FooViewModel(Guid guid)
    {
        // ...
    }
}