我正在使用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;
}
}
答案 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内容属性则不需要这样做。