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

时间:2012-02-20 13:58:45

标签: c# mvvm user-controls viewmodel mvvm-light

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

1 个答案:

答案 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
    }
}
  1. Main属性使用Lauent的SimpleIoc容器来创建实例。这个容器的一个属性是,它将每个类型视为单例。因此,如果您使用此VM生成方法,您将在整个视图中共享VM。

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

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

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

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