【问题标题】:Passing A Parameter To ViewModel Constructor For CustomControl将参数传递给 CustomControl 的 ViewModel 构造函数
【发布时间】:2015-04-02 10:06:21
【问题描述】:

我使用此 XAML 将数据上下文分配给 CustomControl:

 <Setter Property="DataContext" Value="{Binding TimeUnitGridViewModel, Mode=OneWay, Source={StaticResource Locator}}" />

这按预期工作。 “Locator”是在文件资源中声明的 MVVMlight ViewModelLocator。

我将如何重写此 XAML 以允许将参数传递到 ViewModel 的构造函数?我应该可以使用属性注入,但我不知道语法。

编辑:

这是我在 ViewModelLocator 中使用的代码:

        public TimeUnitGridViewModel TimeUnitGridViewModel

    {
        get
        {
            return ServiceLocator.Current.GetInstance<TimeUnitGridViewModel>(Guid.NewGuid().ToString());
        }
    }

【问题讨论】:

  • 我不确定这种方法。我(肯定很快会被纠正)的理解是,您的绑定必须针对预先存在的对象进行。您不能通过绑定调用事物(即 ViewModel)。在某个地方的 View 上的 Loaded 事件上使用事件触发器可能是一个更好的主意吗?触发器触发 ViewModel 方法,该方法使用您的参数实例化 TimeUnitGridViewModel。
  • 嗯。你让我想知道为什么它现在确实起作用了。我在视图模型定位器中使用它:' public TimeUnitGridViewModel TimeUnitGridViewModel { get { return ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); } }'
  • 第一个绑定可以正常工作,因为 ViewModelLocator 已经创建了 TimeUnitGridViewModel 的实例。对该 ViewModel 的后续绑定将引用相同的实例。可以创建该 ViewModel 的多个实例,但它会使事情变得有些复杂(参见 LBugnion 的回答:stackoverflow.com/questions/2830517/…)。您要传入的参数是什么,它的作用是什么?
  • 我需要同时在两个地方使用相同的视图/视图模型——一个代表计划,一个代表实际。我想避免对同一个对象进行两次编码,所以我想我会在指定 planactual 时传递一个枚举,这样当我注册消息时 other i> 实例不作用于它们。
  • @goobering,只是一个旁注:“你不能通过绑定来调用事物。” -> 是的,您可以使用 ObjectDataProvider。它甚至还有一个 ConstructorParameters 属性。但那是无关紧要的。在这里,我对两个不同视图模型的枚举标志的想法有点害怕。一个基本视图模型的两个子类怎么样?

标签: wpf xaml mvvm-light


【解决方案1】:

ObjectDataProvider可以定义为windows资源,可能是这样的:

<Window.Resources>
  <ObjectDataProvider x:Key="myProvider" ObjectType="{x: Type TimeUnitGridViewModel}" MethodName="GetMyself">
  <ObjectDataProvider.ConstructorParameters>
    <system:String>some parameter, or your enum instead...</system:String>
  </ObjectDataProvider.ConstructorParameters>
</Window.Resources>

方法GetMyself 只包含return this; 然后,您的绑定将是:

<Setter Property="DataContext" Value="{Binding Source={StaticResource myProvider}}" />

但是再一次,你的这个“视图模型”并不是真正的 MVVM 中的视图模型。另外,你只能像这样进行单向绑定,不能通过 ObjectDataProvider 从视图中更新视图模型!

因此,我再次建议拥有一个基本视图模型类并从中派生 PlanTimeUnitGridViewModel 和 ActualTimeUnitGridViewModel。像这样,您的代码没有冗余,您可以使用这两个视图模型,因为它们应该在 MVVM 模式中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多