MVVM Light。在多个XAML页面中使用相同的XAML / ViewModel作为子视图

时间:2016-03-22 16:15:09

标签: c# wpf mvvm-light

我正在使用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;
    }    
}

2 个答案:

答案 0 :(得分:1)

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

此语法如下:

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

您设置为键的内容可以是任何内容,只要它对于给定类型T是唯一的。

答案 1 :(得分:1)

我需要做的就是更新我的ViewModel Locator并添加2个新的道具,这些道具都获得了sameviewmodel的实例但是使用了不同的键:

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属性,该属性绑定到视图中的Content Control:

 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内容属性则不需要这样做。