我需要将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));
答案 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
并将其用作依赖项。