0

我在 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 单例?

4

1 回答 1

0

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

第二个问题——因为你有多个枢轴并且想要多个不同的视图模型实例,你可能做的最好的事情就是不要在 ViewModelLocator 中添加MyViewModel视图模型,而是在其中动态创建它。这样你就不会把它当作一个单例,这正是你想要的。这样您不会丢失任何 MVVM Light 功能,只需在每次创建控件时重新创建和重新获取数据。

但是,如果用于获取数据的“键”来自受约束的集合(因此其中会有 5 个而不是 100 个)并且希望在第一次加载后继续加载数据,您可以在ViewModelLocator 的构造函数正常

SimpleIoc.Default.Register<MyViewModel>();

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

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

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

于 2014-01-10T00:35:06.133 回答