そういう動きをするビヘイビアを作ればOKです。こんな感じで。
public class ViewModelCleanupBehavior : Behavior<Window> { protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.Closed += this.WindowClosed; } private void WindowClosed(object sender, EventArgs e) { (this.AssociatedObject.DataContext as IDisposable)?.Dispose(); } protected override void OnDetaching() { base.OnDetaching(); this.AssociatedObject.Closed -= this.WindowClosed; } }
使い方はこんな感じ。
<Window x:Class="CloseAndDisposeSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:CloseAndDisposeSample" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext> <i:Interaction.Behaviors> <local:ViewModelCleanupBehavior /> </i:Interaction.Behaviors> <Grid> </Grid> </Window>
これでMainWindowViewModelがIDpsopsableを実装していれば、Windowが閉じられたときにDisposeメソッドが呼び出されます。
めでたしめでたし。