我有一个用户控制我在其他视图中使用的患者列表。但是,当我选择其中一个患者时,选择将传播到包含用户控件实例的所有视图。如何让每个视图为每个视图实例化一个用户控件的新实例? 我正在使用c#
答案 0 :(得分:3)
根据您的说法猜测,我假设您从您的定位器返回了您的PatientViewModel静态实例。要解决此问题,请确保在调用属性时生成视图模型的新实例。
编辑:具有不同实例化方法的定位器
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生成方法,您将在整个视图中共享VM。
StaticMain
属性大致相同,但它不是使用Laurent的容器,而是拥有VM的静态实例,该实例也在视图之间共享。
NewMain
属性会在每次调用时创建一个新VM,因此,不会在视图之间共享VM。
NewIocMain
属性还会在每次调用时创建一个新VM,因此不会在视图之间共享VM。但是,SimpleIoc
容器包含对创建的实例的引用。它不会自动释放此实例,您必须使用您用于创建的密钥(Guid)调用SimpleIoc.Default.Unregister(key)
,以便在您不再需要时从容器中删除该实例。
您可以选择使用另一个IOC容器(例如Unity),而不是使用SimpleIoc
,这样可以更好地控制实例的创建方式和生存时间。除此之外,我会选择NewMain
方法。