gpt4 book ai didi

c# - 从 MVVM Light ViewModelLocator 获取唯一 ViewModel 的正确方法

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

在我的 UWP 应用程序中,我使用 MVVM Light 及其 ViewModelLocator 来获取 ViewModel。

我的 ViewModelLocator 看起来像这样,我将 guid 传递给 GetInstance 以获得唯一的 VM。

    public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MyViewModel>();
}
public MyViewModel MyVM => ServiceLocator.Current.GetInstance<MyViewModel>(Guid.NewGuid().ToString());
}

我有用户控件,它需要有唯一的虚拟机,因为我的应用程序中可以有这个用户控件的多个实例。以下是我获取 ViewModel 的方法:
<UserControl x:Class="My.App.Controls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding Path=MyVM, Source={StaticResource ViewModelLocator}}">
...
</UserControl>

这是获得独特虚拟机的正确方法吗?或者即使不再使用我的用户控件,VM 是否仍然被缓存,没有被释放?

更新

所以看来我的代码工作正常,我每次都得到唯一的 MyVM 实例。

现在的问题是,取消注册/处置 View 模型的正确方法是什么。

我可以用 SimpleIoc.Default.Unregister(guid)但是在我当前的实现中,将 Guid(用于创建 VM)提供给我的用户控件并不是很直接,因此我可以取消注册 VM。

总的来说,如果我只是在没有 SimpleIoc 的情况下创建我的 VM 运行时 im ViewModelLocator,除了失去依赖注入(inject)之外,还有其他缺点吗?
    public class ViewModelLocator
{
public MyViewModel MyVM => new MyViewModel();
}

最佳答案

我假设您的 UserControl 必须由某些 View (窗口)使用。

控制该 View 的 ViewModel 可以为 UserControl 生成所需的 ViewModel。您可以将 UserControl 绑定(bind)到此“SubViewModel”属性,然后按照您的意愿处理它们。

关于c# - 从 MVVM Light ViewModelLocator 获取唯一 ViewModel 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37186157/

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