Livet で Messenger を使ってみる(その四)

なんか某所で、先日のエントリから話が発展して、かなり盛り上がってた(?)ようなので・・・
コードビハインドがどーのと言ってましたが、本来なら以下のようにすべきで、コードビハインド使う必要ないと思うんですがねぇ・・・。



ViewModel

まず ViewModel です。こちらにダイアログ関連のメソッドを移動しました。

Public Class MainWindowViewModel
	Inherits ViewModel

#Region "InformCommand"
	Private _InformCommand As ViewModelCommand

	Public ReadOnly Property InformCommand() As ViewModelCommand
		Get
			If _InformCommand Is Nothing Then
				_InformCommand = New ViewModelCommand(AddressOf Inform)
			End If
			Return _InformCommand
		End Get
	End Property

	Private Sub Inform()
		MessageBox.Show("情報を表示します。", "表示", MessageBoxButton.OK, MessageBoxImage.Asterisk)
		MessageBox.Show("InformCommand コマンドが実行されました。")
	End Sub
#End Region

#Region "ConfirmCommand"
	Private _ConfirmCommand As ViewModelCommand

	Public ReadOnly Property ConfirmCommand() As ViewModelCommand
		Get
			If _ConfirmCommand Is Nothing Then
				_ConfirmCommand = New ViewModelCommand(AddressOf Confirm)
			End If
			Return _ConfirmCommand
		End Get
	End Property

	Private Sub Confirm()
		If MessageBox.Show("実行しますか?", "確認",
						   MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then
			MessageBox.Show("「はい」が選択されました。")
		End If
	End Sub
#End Region

#Region "OpenCommand"
	Private _OpenCommand As ViewModelCommand

	Public ReadOnly Property OpenCommand() As ViewModelCommand
		Get
			If _OpenCommand Is Nothing Then
				_OpenCommand = New ViewModelCommand(AddressOf Open)
			End If
			Return _OpenCommand
		End Get
	End Property

	Private Sub Open()
		Dim dlg = New Microsoft.Win32.OpenFileDialog() With {
				.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*",
				.Title = "テキストファイルを開く"
			}
		If dlg.ShowDialog() Then
			MessageBox.Show("選択されたファイルは " + dlg.FileName + " です。")
		End If
	End Sub
#End Region

#Region "SaveCommand"
	Private _SaveCommand As ViewModelCommand

	Public ReadOnly Property SaveCommand() As ViewModelCommand
		Get
			If _SaveCommand Is Nothing Then
				_SaveCommand = New ViewModelCommand(AddressOf Save)
			End If
			Return _SaveCommand
		End Get
	End Property

	Private Sub Save()
		Dim dlg = New Microsoft.Win32.SaveFileDialog() With {
				.Filter = "テキストファイル(*.txt)|*.txt",
				.Title = "テキストを保存"
			}
		If dlg.ShowDialog() Then
			MessageBox.Show("保存しようとしたファイル名は " + dlg.FileName + " です。")
		End If
	End Sub
#End Region

End Class

View

次に View です。ボタンはすべて ViewModel のコマンドとバインドさせてますので、コードビハインドを使う必要はありません。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
	xmlns:local="clr-namespace:LivetWPFApplication1"
	xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
	x:Class="MainWindow"
	Title="MainWindow" Height="300" Width="200">
	<Window.DataContext>
		<local:MainWindowViewModel />
	</Window.DataContext>
	<StackPanel>
		<Button Content="表示" Command="{Binding InformCommand, Mode=OneWay}" />
		<Button Content="確認" Command="{Binding ConfirmCommand, Mode=OneWay}" />
		<Button Content="開く" Command="{Binding OpenCommand, Mode=OneWay}" />
		<Button Content="保存" Command="{Binding SaveCommand, Mode=OneWay}" />
	</StackPanel>
</Window>


Livet のメッセージアクション使わないならこれでいいかと。ただしテストは面倒になりますけどね。