【问题标题】:MVVM Light. Use same XAML/ViewModel as sub view in multiple XAML pagesMVVM 灯。在多个 XAML 页面中使用相同的 XAML/ViewModel 作为子视图
【发布时间】:2016-03-22 16:15:09
【问题描述】:

我正在使用 MVVMLight 并使用视图模型构建了一个子视图 XAML 页面。我想将此代码用作多个 XAML 页面中的子视图。

当我这样做时,定位器显然链接到一个版本。因此,当我在一个页面上更改视图模型时,其他页面的子视图模型也会更改。

我已经搜索了解决方案,但似乎找不到解决方法。

我的 Viewmodel 定位器如下所示:

public ViewModelLocator()
{
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        }
        else
        {
            SimpleIoc.Default.Register<IDataService, DataService>();
        }

        SimpleIoc.Default.Register<Page1ViewModel>();
        SimpleIoc.Default.Register<Page2ViewModel>();
        SimpleIoc.Default.Register<SubViewModel>();
}

在 Page1 和 Page2 中,我连接到同一个 SubViewModel,这显然是问题所在:

public class Page1ViewModel: MyBase_ViewModel
{
    IDataService services;
    public Page1ViewModel(IDataService serv)
    {
        services = serv;
        SubViewModel= Locator.SubViewModel;
    }    
}

【问题讨论】:

    标签: c# wpf mvvm-light


    【解决方案1】:

    您需要做的是使用密钥检索您的视图模型。这样,您可以获得相同 ViewModel 类型的多个实例,并且它们都存储在您的 ioc 中。

    其语法如下:

    ServiceLocator.Current.GetInstance<T>(key);
    

    你设置的键可以是任何东西,只要它对于给定的类型 T 是唯一的。

    【讨论】:

    • 感谢您的回答。那么如何在使用相同 xaml 但具有自己不同视图模型的多个视图中使用内容控件?
    • 每次加载 View 时分配正确的 ViewModel(使用键检索)
    • 我该怎么做。在 XAML 中,我将 datacontext 设置为 Locator 中的 ViewModel:
    • DataContext="{Binding SubViewModel, Source={StaticResource Locator}}"
    • 不,这是不可能的,您需要通过从您的 ioc 中检索视图模型,在视图后面的代码中设置视图的数据上下文
    【解决方案2】:

    我需要做的就是更新我的 ViewModel Locator 并添加 2 个新道具,它们都获得了相同视图模型的实例,但使用不同的键:

    public SubViewModel SubViewModel_Page1 { get { 
        return ServiceLocator.Current.GetInstance<SubViewModel>("any key.... 1"); } }
    public SubViewModel SubViewModel_Page1 { get { 
        return ServiceLocator.Current.GetInstance<SubViewModel>("any key.... 2"); } }
    

    然后在视图模型的 Page1 和 Page2 启动器代码中,我设置了绑定到视图中的内容控件的 SubViewModel 属性:

     public Page1VM(IDataService serv)
        {
            Page1SubViewModel = Locator.SubViewModel_Page1;
        }    
    
    private SubViewModel _Page1SubViewModel;
    public SubViewModel Page1SubViewModel
    {
            get
            {
                return _Page1SubViewModel;
            }
            set
            {
                if (_Page1SubViewModel == value)
                    return;
                _Page1SubViewModel = value;
                RaisePropertyChanged();
            }
        }
    

    在母版页的 XAML 中:

    <UserControl.Resources>
        <DataTemplate DataType="{x:Type vm:SubViewModel}">
            <views:SubView />
        </DataTemplate>
    </UserControl.Resources>
    
    <ContentControl Content="{Binding Page1SubViewModel}" />
    

    我还必须删除 SubView XAML 页面上的 DataContext 属性,因为如果绑定到 ContentControl Content 属性,则不需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多