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