そういう動きをするビヘイビアを作ればOKです。こんな感じで。
publicclass ViewModelCleanupBehavior : Behavior<Window> { protectedoverridevoid OnAttached() { base.OnAttached(); this.AssociatedObject.Closed += this.WindowClosed; } privatevoid WindowClosed(object sender, EventArgs e) { (this.AssociatedObject.DataContext as IDisposable)?.Dispose(); } protectedoverridevoid 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メソッドが呼び出されます。
めでたしめでたし。