MVVM Light - ViewModel重用

时间:2014-01-09 17:22:31

标签: c# windows-phone-8 viewmodel mvvm-light viewmodellocator

我在Windows Phone 8中使用Pivot Control,而我正在使用MVVM Light。

我创建了一个UserControl,它将是每个PivotItem的内容,以及我的UserControl应该使用的ViewModel。

例如:

    ObservableCollection<PivotItem> Pivots = new ObservableCollection<PivotItem>();
    for (i = 0; i < length; i++) {
       Pivots.Add(new PivotItem() { Content = new MyUserControl() });
    }

通常在我的UserControl构造函数中我有这样的东西(我认为这不是一个好的实践?):

    DataContext = new ViewModelLocator().MyViewModel;

此ViewModel将根据位置键从数据库中获取数据。我的问题是如何将该密钥传递给MyViewModel而不是MyViewModel Singleton?

1 个答案:

答案 0 :(得分:0)

首先 - 您不应该创建ViewModelLocator的新实例。有一个 root ,它会自动添加到App.Resources元素的App.xaml页面中。您可以在XAML中将其作为 {StaticResource Locator} 或在代码中作为 App.Resources [“Locator”] 引用。

Secod问题 - 由于你有多个支点并想要多个不同的View Model实例,你可能做的最好的事情就是不在ViewModelLocator中添加 MyViewModel 视图模型,只需在那里创建它苍蝇这样你就不会把它作为一个单身人士,这正是你想要的。您不会以这种方式丢失任何MVVM Light功能,只需在每次创建控件时重新创建和重新获取数据。

如果您用来获取数据的“键”来自约束集(因此会有类似5个而不是100个),并希望在第一次加载后保持数据加载,您可以注册通常在ViewModelLocator的构造函数中 MyViewModel

SimpleIoc.Default.Register<MyViewModel>();

然后在代码中使用以下语法:

SimpleIoc.Default.GetInstance<MyViewModel>( "somekeyvalue" );

这会将提供的键值与SimpleIoc现有视图模型的内部字典进行比较,如果已经存在,将返回现有实例,否则将创建一个新实例并将其存储在键下以供将来重用。