インターネット上で広範囲に検索した後、実際の解決策が見つからなかったので、独自のカスタム を開発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;
}
魔法のように動作します!