我可以在其他 View 中使用“患者列表”的用户控制。但是,当我选择“患者”之一时,选择将传播到包含用户控件实例的所有 View 。如何使每个 View 实例化每个 View 的用户控件的新实例?
我正在使用C#
最佳答案
根据您所说的猜测,我假设您从定位器返回了PatientViewModel的静态实例。为了解决这个问题,请确保在调用该属性时生成 View 模型的新实例。
编辑:具有不同实例化方法的定位器
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//if (ViewModelBase.IsInDesignModeStatic)
//{
// // Create design time view services and models
// SimpleIoc.Default.Register<IDataService, DesignDataService>();
//}
//else
//{
// // Create run time view services and models
// SimpleIoc.Default.Register<IDataService, DataService>();
//}
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public MainViewModel StaticMain
{
get
{
return _staticMain ?? (_staticMain = new MainViewModel());
}
}
private static MainViewModel _staticMain;
public MainViewModel NewMain
{
get
{
return new MainViewModel();
}
}
public MainViewModel NewIocMain
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
Main
属性使用Lauent的SimpleIoc
容器创建一个实例。此容器的特性之一是,它将每种类型都视为单例。因此,如果使用这种VM生成方法,则将在整个 View 中共享VM。 StaticMain
属性的功能大致相同,但是它没有使用Laurent的容器,而是保留了VM的静态实例,该实例也在 View 之间共享。 NewMain
属性在每次调用时都会创建一个新的VM,因此, View 之间不会共享该VM。 NewIocMain
属性还在每次调用时创建一个新的VM,因此该VM在 View 之间不共享。但是,SimpleIoc
容器包含对创建的实例的引用。它不会自动释放该实例,一旦不再需要该实例,则必须使用创建时使用的 key (Guid)调用SimpleIoc.Default.Unregister(key)
从容器中删除该实例。 显然,您可以选择使用另一个IOC容器(例如Unity)来代替
SimpleIoc
,该容器使您可以更好地控制实例的创建方式和生存时间。除此以外,鉴于您的情况,我会选择NewMain
方法。关于c# - MVVMLight UserControl View 模型-为每个 View 创建用户控件的新实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9362332/