我有一个主要ViewModel包含我正在使用的一定数量的项目列表UserControls,它们显示在ContentControl主视图中.我现在的之间交换数据的方式ViewModels存在,使得每个的一个参考的ViewModels主ViewModel,主要的一个ViewModel在每一个UserControl.但是我不知道这是不是这样做的正确方法,因为我有一个ViewModelLocator,我希望这个类有一些功能来支持这样的事情.
任何人都可以告诉我,如果我正在做这个,或者在MVVM Light中有更好的方法吗?
编辑:
当我在寻找不同的东西时,我发现了这个,这会是一个更好的解决方案吗?
private ViewModelLocator locator = new ViewModelLocator();
Run Code Online (Sandbox Code Playgroud)
然后使用定位器属性来引用每个ViewModel?
EDIT2:
显然我认为可以工作的不是,起初我只有主要的参考ViewModel,这工作,但当我尝试这种UserControls方式崩溃我的应用程序.我正在尝试第一次编辑的可能解决方案.
MainViewModel.cs(其他类似,仅参考主ViewModel)
public class MainViewModel : ViewModelBase
{
private ItemAddViewModel itemAddViewModel;
private ItemsViewModel itemsViewModel;
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
ItemsList = Item.GetItemsList();
itemAddViewModel = ServiceLocator.Current.GetInstance<ItemAddViewModel>();
itemsViewModel = ServiceLocator.Current.GetInstance<ItemsViewModel>();
ShowItemsView();
}
...
private void ShowItemsView()
{
CurrentControl = itemsViewModel;
}
...
Run Code Online (Sandbox Code Playgroud)
eMk*_*Mko 17
您实际上可以使用ViewModelLocator.默认情况下使用Inversion of Control Container,因此即使您创建了Locator的新实例,您也将从容器中获得相同的singleton viewmodel实例.
Locator类:
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<ViewModel1>();
SimpleIoc.Default.Register<ViewModel2>();
SimpleIoc.Default.Register<ViewModel3>();
}
public ViewModel1 ViewModel1
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel1>();
}
}
public ViewModel2 ViewModel2
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel2>();
}
}
public ViewModel3 ViewModel3
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel3>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后从代码中你可以访问它
var vm1 = (new ViewModelLocator ()).ViewModel1;
Run Code Online (Sandbox Code Playgroud)
你得到了viewmodel的唯一实例.
来自xaml:Resources(默认位于App.xaml中的Application.Resources)
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
Run Code Online (Sandbox Code Playgroud)
和视图的DataContext(用户控件或窗口或其他)
<UserControl
...
DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"
... >
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8148 次 |
| 最近记录: |