Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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# 如何清理通过DependencyInjection创建的viewmodel?_C#_Ninject_Mvvm Light - Fatal编程技术网

C# 如何清理通过DependencyInjection创建的viewmodel?

C# 如何清理通过DependencyInjection创建的viewmodel?,c#,ninject,mvvm-light,C#,Ninject,Mvvm Light,使用Ninject和MVVMLight。使用与viewmodel的TransientScope绑定 视图消失后,viewmodel将退出范围 清理viewmodel的触发器是什么…我有一些已注册的事件需要注销 我可以在view unloaded事件上使用EventToCommand,但我想学习如何使用Ninject MVVMLight方法:)我在任何地方都找不到任何示例,包括文档 视图模型定位器 public class ViewModelLocator { //CONSTRU

使用Ninject和MVVMLight。使用与viewmodel的TransientScope绑定

视图消失后,viewmodel将退出范围

清理viewmodel的触发器是什么…我有一些已注册的事件需要注销

我可以在view unloaded事件上使用EventToCommand,但我想学习如何使用Ninject MVVMLight方法:)我在任何地方都找不到任何示例,包括文档

视图模型定位器

    public class ViewModelLocator
{

    //CONSTRUCTOR
    static ViewModelLocator()
    {
        Kernel = new StandardKernel(new DataViewsModule());
    }

    //PRIVATE FIELDS
    private static IKernel Kernel;

    //PUBLIC PROPERTIES
    public LiveDataViewModel LiveDataViewModel { get { return Kernel.Get<LiveDataViewModel>(); } }


    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup()
    {

    }
}

下面是调用ViewModelLocator清理方法的视图的卸载事件。如何清理此瞬态viewmodel?

当对象绑定到TransientScope中时,这意味着它仅在需要时由Ninject激活,但Ninject不再跟踪该对象,因此由您来进行清理

我建议创建一些自定义范围,并使您的viewmodel
IDisposable
。Ninject将在作用域的和处对该对象调用
Dispose()。让包含一些资源的对象实现
IDisposable
是一种很好的做法,这样它们在工作完成后会自行清理

还要看看这个有趣的Ninject扩展:。它提供了一些额外的作用域实现。我建议您可以尝试
InParentScope()

    class DataViewsModule : NinjectModule
{
    public override void Load()
    {
        //View Models
        Bind<DataViewsViewModel>().ToSelf().InSingletonScope();
        Bind<LiveDataViewModel>().ToSelf().InTransientScope();
    }
}
        public LiveDataView()
    {
        InitializeComponent();
        Unloaded += (s, e) => ViewModelLocator.Cleanup();
    }