Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从MVVM Light ViewModelLocator获取唯一ViewModel的正确方法_C#_Mvvm_Win Universal App_Viewmodel_Mvvm Light - Fatal编程技术网

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

C# 从MVVM Light ViewModelLocator获取唯一ViewModel的正确方法,c#,mvvm,win-universal-app,viewmodel,mvvm-light,C#,Mvvm,Win Universal App,Viewmodel,Mvvm Light,在我的UWP应用程序中,我使用MVVM Light及其ViewModelLocator获取ViewModels 我的ViewModelLocator如下所示,我将guid传递给GetInstance以获得唯一的VM public class ViewModelLocator { static ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => Sim

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

我的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());
    }

我假设您的UserControl必须由某个视图(窗口)使用


控制该视图的ViewModel可以为UserControl生成所需的ViewModels。您可以将UserControl绑定到此“SubViewModel”属性,也可以按照自己的意愿处置它们。

您可以向视图模型添加其他属性,并在视图中调用自定义移除方法来处置视图模型

视图模型的修改getter如下所示:

    public MyViewModel MyVM
    {
        get
        {
            String id = Guid.NewGuid().ToString();
            var instance = SimpleIoc.Default.GetInstance<MyViewModel>(id);
            instance.ID = id;
            return instance;
        }
    }
    public static void UnregisterMyVM(String id)
    {
        SimpleIoc.Default.Unregister<MyViewModel>(id);
    }

听起来你应该使用数据绑定而不是ViewModelLocator。你能举个简单的例子吗。注意答案中的#4。如果要清理IOC容器中的viewmodels,请在NavigatedFrom上注销它们(如果这符合您的要求)。使用unique VM是否意味着每个usercontrol实例都有一个不同的实例?如果是这样,你用正确的方式写了它。更新了原始问题。因此,基本上问题不是如何正确地注销VM。
    public MyViewModel MyVM
    {
        get
        {
            String id = Guid.NewGuid().ToString();
            var instance = SimpleIoc.Default.GetInstance<MyViewModel>(id);
            instance.ID = id;
            return instance;
        }
    }
    public static void UnregisterMyVM(String id)
    {
        SimpleIoc.Default.Unregister<MyViewModel>(id);
    }
    public MyView()
    {
        InitializeComponent();

        this.Closed += ((sender, arguments) =>
        {
            var viewModel = ((MyViewModel)this.DataContext);
            viewModel.Dispose();
            ViewModelLocator.UnregisterSourceCodeViewer(viewModel.ID);
            this.DataContext = null;
        });
    }