Исходя из того, что вы заявили, я предполагаю, что вы возвращаете статический экземпляр вашей 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
использует контейнер SimpleIoc
Lauent для создания экземпляра. Одним из свойств этого контейнера является то, что он рассматривает каждый тип как синглтон. Таким образом, если вы используете этот метод генерации виртуальных машин, вы будете использовать виртуальную машину во всех представлениях.
Свойство StaticMain
делает то же самое, но вместо использования контейнера Лорана оно содержит статический экземпляр виртуальной машины, который также разделяется между представлениями.
Свойство NewMain
создает новую ВМ при каждом вызове, поэтому ВМ не разделяется между представлениями.
Свойство NewIocMain
также создает новую ВМ при каждом вызове, и, следовательно, ВМ не разделяется между представлениями. Однако контейнер SimpleIoc
содержит ссылку на созданный экземпляр. Он не освобождает этот экземпляр автоматически, и вам нужно вызвать SimpleIoc.Default.Unregister(key)
с ключом, который вы использовали для создания (Guid), чтобы удалить экземпляр из контейнера, когда он вам больше не нужен.
Вместо использования SimpleIoc
вы, очевидно, можете выбрать другой контейнер IOC - например, Unity - который позволяет вам лучше контролировать, как создаются ваши экземпляры и как долго они живут. За исключением этого, я бы выбрал подход NewMain
, указанный в вашем случае.