gpt4 book ai didi

c# - MVVMLight UserControl View 模型-为每个 View 创建用户控件的新实例

转载 作者:行者123 更新时间:2023-12-03 10:24:13 25 4
gpt4 key购买 nike

我可以在其他 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com