MVVMLight UserControl视图模型 – 为每个视图创建新的用户控件实例

我有一个用户控制我在其他视图中使用的患者列表。 但是,当我选择其中一个患者时,选择将传播到包含用户控件实例的所有视图。 如何让每个视图为每个视图实例化一个用户控件的新实例? 我正在使用c#

根据你的说法猜测,我假设你从你的定位器返回一个你的PatientViewModel静态实例。 要解决此问题,请确保在调用属性时生成视图模型的新实例。

编辑:具有不同实例化方法的定位器

public class ViewModelLocator { public ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); //if (ViewModelBase.IsInDesignModeStatic) //{ // // Create design time view services and models // SimpleIoc.Default.Register(); //} //else //{ // // Create run time view services and models // SimpleIoc.Default.Register(); //} SimpleIoc.Default.Register(); } public MainViewModel Main { get { return ServiceLocator.Current.GetInstance(); } } 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(Guid.NewGuid().ToString()); } } public static void Cleanup() { // TODO Clear the ViewModels } } 
  1. Main属性使用Lauent的SimpleIoc容器来创建实例。 这个容器的一个属性是,它将每个类型视为单例。 因此,如果您使用此VM生成方法,您将在整个视图中共享VM。

  2. StaticMain属性的function大致相同,但它不是使用Laurent的容器,而是保存VM的静态实例,该实例也在视图之间共享。

  3. NewMain属性在每次调用时都会创建一个新VM,因此,不会在视图之间共享VM。

  4. NewIocMain属性还会在每次调用时创建新VM,因此不会在视图之间共享VM。 但是, SimpleIoc容器包含对创建的实例的引用。 它不会自动释放此实例,您必须使用您用于创建的密钥(Guid)调用SimpleIoc.Default.Unregister(key) ,以便在不再需要时从容器中删除该实例。

您可以选择使用另一个IOC容器(例如Unity),而不是使用SimpleIoc ,这样可以更好地控制实例的创建方式和生存时间。 除此之外,考虑到你的情况,我会选择NewMain方法。