【问题标题】:How to pass a guid parameter to viewmodel constructor in silverlight 4 using MVVM Light如何使用 MVVM Light 在 silverlight 4 中将 guid 参数传递给 viewmodel 构造函数
【发布时间】:2014-10-01 18:17:48
【问题描述】:

我需要将 id 传递给我的 viewmodel 构造函数。这个 id 是外部的,它被传递到包含 silverlight 应用程序的网页。我正在使用 MVVM Light 框架。 我看过几篇关于将参数传递给视图模型的文章,但在所有这些文章中,参数都是全局的,或者可以在没有参数的情况下实例化。 在我的情况下,我的视图模型的构造函数中需要一个 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));

【问题讨论】:

  • 为什么不能使用属性注入?
  • 我不知道该怎么做。你能为我指出正确的方向吗?我在 silverlight 和/或 MVVM 方面不是很有经验。
  • 与 mvvm 无关。您首先构造对象,然后使用属性或 Initialize(Guid) 方法设置 guid
  • @dan 和你的见解我一直在调查这件事,这就是我目前所处的位置。我的视图模型具有 Id 属性,并且我还有一个设置 Id 的 RelayCommand。现在我正在尝试将此命令绑定到视图的 onload,以便它在加载时设置视图模型的 id。我想这就是你指向我的地方。现在的问题是如何将参数传递给RelayCommand。参数 id 来自包含 silverlight 的网页。如何从视图中获取 id 到视图模型,仍然完全解耦?
  • 我的回答呢?

标签: mvvm silverlight-4.0 mvvm-light


【解决方案1】:

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

【讨论】:

  • 视图可以用MVVM light的SimpleIoc注册GUID
  • 我正在使用 MVVM 灯光和 ViewModelLocator,但使用的是 UnityContainer。我认为两者都会起作用,对吗?如果我理解我应该让 ViewModelLocator 的构造函数接收 GUID 参数。如何在视图中注册 GUID。在代码隐藏中?不会被绑定吗?
  • 我在这里看不到绑定的任何用处。当您读取 GUID 时,将其传递给您选择的定位器或 IoC 容器。对我来说,这似乎是一个简单而有效的解决方案。
  • 也许更详细地解释你如何获得 GUID
  • 我以为这就是您在第一次谈到财产注入时所指向的内容。对不起,但我对这一切有点困惑。如果我在定位器构造函数运行时将 GUID 放入,则会出现异常“在 ViewModel.ViewModelLocator 类型上找不到匹配的构造函数”
【解决方案2】:

通过Typed Factory Facility 使用工厂。您将像这样定义工厂接口:

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

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

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

然后,您将解析IFooViewModelFactory 并调用Create,而不是仅仅解析IFooViewModel

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)
    {
        // ...
    }
}

【讨论】:

  • 他没有提到温莎,我错了吗?无论如何,工厂的想法可能会达到目的
  • @dan 哇,你说得对,真丢脸。我想我在自己的标签集上花了太多时间!
  • 我不知道Windsor或者Typed Factory Facility是什么,也许是UnityContainer之类的容器?但无论如何,我仍然想念如何将 Id 从视图获取到视图模型。
  • @budahead 使用 MVVM light SimpleIoc 来实现。注册 GUID,您可以将其用作 VM 中的依赖项
  • Windsor 是一个 IOC 容器,类似于 Unity。如果您不使用 IOC 容器,那么您可以忽略我的回答。如果你是,你的 IOC 容器中应该有一个类似的结构。请记住,您试图从视图的 view-model 中获取 Guid,而不是 view 本身。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多