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

时间:2014-08-08 09:49:21

标签: mvvm silverlight-4.0 mvvm-light

我需要将id传递给我的viewmodel构造函数。此ID是外部的,它将传递到包含silverlight应用程序的网页。我正在使用MVVM Light框架。 我已经看过几篇关于将参数传递给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
}

定位器在视图中传递给DataContext,如下所示:

DataContext =“{Binding Source = {StaticResource Locator}

编辑2:

现在它有效。这是我在视图ctor中添加的用于注册要在VM ctor中使用的GUID的代码:

ViewModel.ViewModelLocator.Container.RegisterType<CautelaVM>(new InjectionConstructor(id));

2 个答案:

答案 0 :(得分:1)

通过Typed Factory Facility使用工厂。您将定义一个工厂界面,如下所示:

public interface IFooViewModelFactory
{
    IFooViewModel Create(Guid guid);
}

然后将设施添加到您的Windsor配置中:

kernel.AddFacility<TypedFactoryFacility>();
kernel.Register(
                Component.For<IFooViewModelFactory>()
                         .AsFactory()
               );

然后,您不仅要解析IFooViewModel,还要解决IFooViewModelFactory并致电Create

public class MainViewModel
{
    readonly IFooViewModelFactory fooViewModelFactory;

    public MainViewModel(IFooViewModelFactory fooViewModelFactory)
    {
        this.fooViewModelFactory = fooViewModelFactory;
    }

    public IFooViewModel CreateFoo(Guid guid)
    {
        return fooViewModelFactory.Create(guid);
    }
}

请注意,Windsor提供工厂的实施,而不是您。此外,工厂使用Create方法参数按名称匹配构造函数中的参数,因此请确保FooViewModel构造函数匹配,例如:

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

答案 1 :(得分:1)

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