5

Prism Regions は、インターフェイスDisposeを実装したビューまたはビュー モデルを自動的に検出して呼び出すと想定していました。IDisposable私が間違っていたことが判明しました。

IActiveAware次に、ビュー/ビューモデルを自分で破棄できるように実装することを検討しましたが、それはかなりハックのようです。自動でやればいいのに。

実装しているビューとビュー モデルを自動的に破棄するように Prism Regions を構成するにはどうすればよいIDisposableですか?

4

2 に答える 2

8

インターネット上で広範囲に検索した後、実際の解決策が見つからなかったので、独自のカスタム を開発RegionBehaviorしました。これは非常にうまく機能することがわかりました。

ビヘイビアーは、領域のビュー コレクションをリッスンして変更を検出し、変更が削除されるDisposeと、ビューやビュー モデルが実装されている場合にのみ、それらをチェックして呼び出しますIDisposable

class DisposeClosedViewsBehavior : RegionBehavior
{
    protected override void OnAttach()
    {
        Region.Views.CollectionChanged += Views_CollectionChanged;
    }

    private void Views_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action != NotifyCollectionChangedAction.Remove) return;

        foreach (var removedView in e.OldItems)
        {
            IDisposable disposableView = removedView as IDisposable;
            IDisposable disposableViewModel;

            var iviewView = removedView as IView;
            if (iviewView != null)
            {
                disposableViewModel = iviewView.DataContext as IDisposable;
            }
            else
            {
                var frameworkElementView = removedView as FrameworkElement;
                disposableViewModel = frameworkElementView?.DataContext as IDisposable;
            }

            disposableView?.Dispose();
            disposableViewModel?.Dispose();
        }
    }
}

ConfigureDefaultRegionBehaviors最後のステップは、ブートストラッパーメソッドをオーバーライドして、この動作をプリズムにプラグインすることです。

protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
    var factory = base.ConfigureDefaultRegionBehaviors();

    factory.AddIfMissing(nameof(DisposeClosedViewsBehavior), typeof(DisposeClosedViewsBehavior));

    return factory;
}

魔法のように動作します!

于 2015-09-01T18:59:36.863 に答える