gpt4 book ai didi

c# - 每次调用方法时创建对象的新实例

转载 作者:行者123 更新时间:2023-11-30 13:31:59 25 4
gpt4 key购买 nike

Messenger.Default.Register<OpenWindowMessage>(this, message =>
{
var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>();
adventurerWindowVM.Adv = message.Argument;
var adventurerWindow = new AdventurerView()
{
DataContext = adventurerWindowVM
};
adventurerWindow.Show();
});

这段代码相当简单;它只是打开一个新窗口并设置新窗口的 DataContext。我遇到的问题是,如果我执行两次,第一个实例的内容将被覆盖并设置为第二个实例的内容,因为 adventurerWindowVM 是两个窗口的 DataContext 并且它被覆盖每次调用此代码。我正在寻找一种方法来防止这种情况;我希望能够使用此消息打开多个窗口并让每个窗口都是独一无二的,但到目前为止我还没有找到这样做的方法。任何建议将不胜感激。我为模糊的标题道歉;我不确定如何命名这个问题。 (另外,我知道这不是一个方法。这个代码块应该叫什么?)

更新:我正在使用 MVVM Light,我的代码基于某人在这个答案中为我提供的示例:https://stackoverflow.com/a/16994523/1667020

这是我的 ViewModelLocator.cs 中的一些代码

public ViewModelLocator()
{
_main = new MainViewModel();

ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<GameViewModel>();
SimpleIoc.Default.Register<AdventurerViewModel>();
}

最佳答案

给出了另一个答案后,我想我可以说这里使用的 IoC 容器只是来自 MvvmLight 的 SimpleIoC 并且在每个 GetInstance(... ) 每次尝试解析 VM 实例时,您需要做的就是传入一个唯一的 key 。

所以你可以切换

var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>();

var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>(System.Guid.NewGuid().ToString());

然而,正如 MVVMLight 的作者所说 Here这些 VM 将被缓存,我们需要在不再需要时删除它们。在您的情况下,可能是 Window 关闭时。

因此我会得到整个 lambda 类似的东西:

Messenger.Default.Register<OpenWindowMessage>(this, message =>
{
var uniqueKey = System.Guid.NewGuid().ToString();
var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>(uniqueKey);
adventurerWindowVM.Adv = message.Argument;
var adventurerWindow = new AdventurerView()
{
DataContext = adventurerWindowVM
};
adventurerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey);
adventurerWindow.Show();
});

注意:

虽然这比使用 (new AdventurerViewModel()) 自己创建一个新 VM 多了 3 行,但我仍然赞成这样做,因为如果您使用 IoC 容器来管理 VM 的生命周期,然后让它完全管理它们。不需要的时候不太喜欢混搭。而是让 IoC 容器做它应该做的事情。

如果您需要更多地控制 VM 注入(inject)和生命周期管理,请查看更复杂的 Ioc Controller ,例如 Unity . SimpleIoC 只是简单地让您在 IoC 类型的容器中“试水”,它在这方面做得很好。

关于c# - 每次调用方法时创建对象的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995365/

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