【问题标题】:MVVM Light - ViewModel reusageMVVM Light - ViewModel 重用
【发布时间】:2014-01-09 17:22:30
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    SimpleIoc.Default.Register<MyViewModel>();
    

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

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

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

    【讨论】:

    • 感谢您的回答。然后我将动态创建 ViewModel。但是如何在我使用 mvvm light 的 Windows Phone 类程序集中获取 ViewModelLocator 的参考?
    • 我的意思是如何在我使用 mvvm light 的 Windows Phone 类库中获取 ViewModelLocalor 的引用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多