MVVM Light 通过 ViewModelLocator 将 ViewModel 传递给 ObjectDataProvider
MVVM Light pass ViewModel to ObjectDataProvider via ViewModelLocator
我有一个 ObjectDataProvider
绑定到我的视图模型的 GetProducts()
方法:
<ObjectDataProvider x:Key="GetProducts"
ObjectType="vm:MainViewModel"
MethodName="GetProducts">
<ObjectDataProvider.MethodParameters>
<m:Subcategory Id="-1"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
据我所知,这会创建一个 MainViewModel
的实例来调用该方法。最近我开始使用 MVVM Light,它的 ViewModelLocator
class 注册了它自己的相同视图模型的实例,所以现在我有两个视图模型而不是一个。
感觉不对,所以我想知道:是否可以将 ViewModelLocator
创建的视图模型传递给 ObjectDataProvider
?
我尝试使用绑定,但 ObjectInstance
属性 显然不是依赖项 属性,因此不能在此处使用。我还能怎么做?
我设法通过完全摆脱 ObjectDataProvider
并向我的视图模型添加一些属性来实现这一目标,例如
// This property took place of MethodParameter[0]
public Subcategory SelectedSubcategory
{
get { return _selectedSubcategory; }
set
{
Set(() => SelectedSubcategory, ref _selectedSubcategory, value);
RaisePropertyChanged("Products");
}
}
public IEnumerable<Product> Products
{
get
{
if (SelectedSubcategory != null)
return SelectedSubcategory.Products;
return null;
}
}
我还需要更改 XAML 中的相应绑定,例如这个:
SelectedItem="{Binding Source={StaticResource GetProducts},
Path=MethodParameters[0],
BindsDirectlyToSource=True,
UpdateSourceTrigger=PropertyChanged}"
变成了:
SelectedItem="{Binding SelectedSubcategory, Mode=OneWayToSource}"
现在我只有一个视图模型实例!耶!
我有一个 ObjectDataProvider
绑定到我的视图模型的 GetProducts()
方法:
<ObjectDataProvider x:Key="GetProducts"
ObjectType="vm:MainViewModel"
MethodName="GetProducts">
<ObjectDataProvider.MethodParameters>
<m:Subcategory Id="-1"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
据我所知,这会创建一个 MainViewModel
的实例来调用该方法。最近我开始使用 MVVM Light,它的 ViewModelLocator
class 注册了它自己的相同视图模型的实例,所以现在我有两个视图模型而不是一个。
感觉不对,所以我想知道:是否可以将 ViewModelLocator
创建的视图模型传递给 ObjectDataProvider
?
我尝试使用绑定,但 ObjectInstance
属性 显然不是依赖项 属性,因此不能在此处使用。我还能怎么做?
我设法通过完全摆脱 ObjectDataProvider
并向我的视图模型添加一些属性来实现这一目标,例如
// This property took place of MethodParameter[0]
public Subcategory SelectedSubcategory
{
get { return _selectedSubcategory; }
set
{
Set(() => SelectedSubcategory, ref _selectedSubcategory, value);
RaisePropertyChanged("Products");
}
}
public IEnumerable<Product> Products
{
get
{
if (SelectedSubcategory != null)
return SelectedSubcategory.Products;
return null;
}
}
我还需要更改 XAML 中的相应绑定,例如这个:
SelectedItem="{Binding Source={StaticResource GetProducts},
Path=MethodParameters[0],
BindsDirectlyToSource=True,
UpdateSourceTrigger=PropertyChanged}"
变成了:
SelectedItem="{Binding SelectedSubcategory, Mode=OneWayToSource}"
现在我只有一个视图模型实例!耶!