0

ウィンドウを使用してRichBoxバインドし、List<String>ListNameこのリストにいくつかの項目を追加しましたが、このウィンドウを閉じて開いた後も、古い追加名が残っています。View モデルは破棄されません。ウィンドウを閉じますが、閉じるときにこれを使用します

public virtual void Cleanup()
{
    this.MessengerInstance.Unregister(this);
}

しかし、これは値のみを消去Messengerし、他のすべてのアイテムを値で許可します。ウィンドウを閉じるときに、このViewModelのすべてのリソースを消去したい

アップデート :

ルディの答えで私はするために閉じることを試みます

SimpleIoc.Default.Unregister<ScanViewModel>();
SimpleIoc.Default.Register<ScanViewModel>();

それは機能しますが、VMの登録を解除して再度登録するのは私には正しくないようです!

4

2 に答える 2

2

必要に応じて、クラス全体を削除するよりも、クラスのインスタンスを登録解除することができます。

からのスニペットSimpleIoc.cs:

//
// Summary:
//     Removes the instance corresponding to the given key from the cache. The class
//     itself remains registered and can be used to create other instances.
//
// Parameters:
//   key:
//     The key corresponding to the instance that must be removed.
//
// Type parameters:
//   TClass:
//     The type of the instance to be removed.
public void Unregister<TClass>(string key) where TClass : class;

解決するたびにクラスの新しいインスタンスを取得することに注意してください。クラスにSimpleIoC一意のキーを指定する必要がありますGetInstance()

そのためViewModelLocator.cs、使用済みへの参照を保持currentKeyし、次の試行で登録解除します。次のようになります。

private string _currentScanVMKey;
public ScanViewModel Scan
{
  get {
    if (!string.IsNullOrEmpty(_currentScanVMKey))
      SimpleIoc.Default.Unregister(_currentScanVMKey);
    _currentScanVMKey = Guid.NewGuid().ToString();
    return ServiceLocator.Current.GetInstance<ScanViewModel>(_currentScanVMKey);
  }
}

このように、VMLocator が新しい VM に対して照会されるたびにScan、現在の VM を登録解除した後に返されます。このアプローチは、"Laurent Bugnion" Hereによって提案されたガイドラインに準拠します。彼は自分のライブラリをよく知っていると思います。そうすれば、間違いはありません。

MVVM Light の作成者の状態は、開発者SimpleIoCに IOC の原則を理解してもらい、自分で調べてもらうことを目的としていたことを覚えています。単純なプロジェクトには最適です。VM インジェクションをより細かく制御したい場合は、Unityなどを検討することをお勧めします。Unity では、現在の状況を簡単に解決できるため、

// _container is a UnityContainer
_container.RegisterType<ScanViewModel>();  // Defaults to new instance each time when resolved
_container.RegisterInstance<ScanViewModel>();  // Defaults to a singleton approach

また、さらに優れた制御を提供する LifeTimeManagers と並べ替えも取得します。はい、Unity は に比べてオーバーヘッドがかかりますが、SimpleIoC自分でコードを書かなければならないよりも、必要なときにテクノロジが提供できるものです。

于 2013-05-27T14:54:46.703 に答える
0

これでうまくいくと思います:

SimpleIoc.Default.Unregister<ViewModelName>();

編集:これはどうですか

    public ViewModelName MyViewModel
    {
        get
        {
            ViewModelName vm = ServiceLocator.Current.GetInstance<ViewModelName>();
            SimpleIoc.Default.Unregister<ViewModelName>();
            //or SimpleIoc.Default.Unregister<ViewModelName>(MyViewModel);
            return vm;
        }
    }
于 2013-05-27T14:10:17.453 に答える