【发布时间】: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/…)。您要传入的参数是什么,它的作用是什么?
-
我需要同时在两个地方使用相同的视图/视图模型——一个代表计划,一个代表实际。我想避免对同一个对象进行两次编码,所以我想我会在指定 plan 或 actual 时传递一个枚举,这样当我注册消息时 other i> 实例不作用于它们。
-
@goobering,只是一个旁注:“你不能通过绑定来调用事物。” -> 是的,您可以使用 ObjectDataProvider。它甚至还有一个 ConstructorParameters 属性。但那是无关紧要的。在这里,我对两个不同视图模型的枚举标志的想法有点害怕。一个基本视图模型的两个子类怎么样?
标签: wpf xaml mvvm-light