2

使用 Ninject 和 MVVMLight。使用 TransientScope 绑定到 viewmodel。

当视图消失时,视图模型会超出范围。

清理我的视图模型的触发器是什么...我有一些需要注销的已注册事件。

我可以在视图卸载事件上使用 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()
    {

    }
}

忍者模块

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

所以这里是调用 ViewModelLocator Cleanup 方法的视图的卸载事件。我该如何清理这个瞬态视图模型?

4

1 回答 1

2

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

我建议创建一些自定义范围并制作您的viewmodel IDisposable。Ninject 将在范围内调用Dispose()该对象上的方法(不适用于瞬态范围,因为它实际上根本没有范围)。最好的做法是让持有一些资源的对象实现IDisposable,以便它们在工作完成后自行清理。

另请查看这个有趣的 Ninject 扩展:https ://github.com/ninject/ninject.extensions.namedscope/wiki 。它提供了一些额外的范围实现。我建议你可以试试InParentScope()

于 2012-12-10T12:29:24.177 回答