1

ShellViewModelでは、新しいウィンドウ「リモートビュー」を開くためのコマンドバインディングの下にあります

public ICommand RemoteViewCommand
{
    get { return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute); }
}

private void RemoteViewExecute()
{
    if (!CanRemoteViewExecute())
    {
        return;
    }


    var shellRemoteView = Application._Container.Resolve<ShellRemoteView>();
    if (_ShellRemoteView.DataContext==null)
        _ShellRemoteView.DataContext = Application._Container.Resolve<ShellRemoteViewModel>();        

    shellRemoteView.Show();
}

起動時に、ライフタイムマネージャーを使用してシングルトンインスタンスを持つ「ShellRemoteView」と「ShellRemoteViewModel」の両方を既に登録しています。

_Container.RegisterType<ShellRemoteView>(new ContainerControlledLifetimeManager());
_Container.RegisterType<ShellRemoteViewModel>(new ContainerControlledLifetimeManager());

shellRemoteView.Show() を実行してフォームを閉じると、再び shellRemoteView.Show() を呼び出すと、Invalid Operation exception:Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelper.EnsureHandle after a Window has closed が発生します。

閉じた場合にウィンドウインスタンスを再度取得するための回避策は Unityにありますか。

4

2 に答える 2

0

View をLifetimeManagerに登録して、インスタンスを 1 つだけ作成する必要があります。Using Lifetime Managers を見てください。

于 2012-04-25T13:44:32.107 に答える
0

この行はあなたの問題です:

return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute); 

基本的に、Get コマンドを呼び出すたびに新しいビューを作成しています。これを修正する方法は、ViewModel レベルでスコープが設定されている GET ステートメントの外に変数を配置することです。毎回新しい参照を作成するのではなく、ビューへの参照を保存してその参照を返すようにします。これを行う最善の方法については、Singleton パターンを参照してください。

于 2012-04-25T12:14:12.410 に答える