2

Ninject と MVVMLight を使用します。viewmodel への TransientScope バインディングの使用。

ビューがなくなると、ビューモデルはスコープから外れます。

ビューモデルをクリーンアップするトリガーは何ですか...登録解除する必要がある登録済みイベントがいくつかあります。

ビューのアンロードイベントで EventToCommand を使用できますが、Ninject MVVMLight の方法でそれを行う方法を学びたいです:)ドキュメントを含め、どこにも見つけることができる例はありません。

ViewModelLocator

    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()
    {

    }
}

NinjectModule

    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 はそのオブジェクトをもう追跡しないため、クリーンアップを行うのはあなたの側にあります。

カスタム スコープを作成し、ビューモデルを作成することをお勧めします IDisposable。Ninject はDispose()、スコープ内でそのオブジェクトのメソッドを呼び出します (実際にはスコープがまったくないため、一時的なスコープでは機能しません)。また、いくつかのリソースを保持するオブジェクトを実装IDisposableすることをお勧めします。これにより、作業が完了したときにオブジェクトがクリーンアップされます。

この興味深い Ninject 拡張機能もご覧ください: https://github.com/ninject/ninject.extensions.namedscope/wiki。いくつかの追加のスコープの実装を提供します。試してみることをお勧めしますInParentScope()

于 2012-12-10T12:29:24.177 に答える