2015-04-02 68 views
0

我分配一个DataContext使用这种XAML一个CustomControl:将参数传递给视图模型构造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()); 
     } 
    } 
+1

我不确定这种方法。我的(肯定很快就会被纠正)的理解是,你的约束必须针对一个预先存在的对象来完成。您不能将事物(即ViewModel)调用为绑定。在View上的Loaded事件上使用事件触发器可能更好一些吗?触发器触发一个ViewModel方法,用您的参数实例化TimeUnitGridViewModel。 – goobering 2015-04-02 10:18:53

+0

嗯。你让我想知道为什么它现在工作。我用这个在视图模型定位:“公共TimeUnitGridViewModel TimeUnitGridViewModel { 得到 { 回报ServiceLocator.Current.GetInstance (Guid.NewGuid()的ToString()); } }' – jidl 2015-04-02 13:34:06

+0

第一个绑定将工作得很好,因为ViewModelLocator已经创建了TimeUnitGridViewModel的一个实例。随后绑定到该ViewModel将引用*相同的实例*。有可能创建该ViewModel的多个实例,但它稍微复杂一些(请参阅LBugnion的答案:http://stackoverflow.com/questions/2830517/how-to-have-multiple-pairs-view-viewmodel/2848084# 2848084)。你试图传入的参数是什么,它有什么作用? – goobering 2015-04-02 14:06:49

回答

0

的ObjectDataProvider的可以被定义为一个窗口资源,也许是这样的:

<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模式一样使用这两种视图模型。