VB のたまご

作成日: 2017/05/14, 更新日: 2017/05/14



DelegateCommand2

  •  引き続き、DelegateCommand です。 前回は、DelegateCommand のインスタンス生成時に、実行したい処理をセットして使いました。 実はこの DelegateCommand は無条件で実行できます。ということは、【実行できるかどうかの判断処理】も指定することもできます。

  • スポンサーリンク


  •  DelegateCommand のインスタンス生成時、第二引数には、【第一引数で指定した処理】を実行できるかどうかの判断処理をセットします。 第二引数で指定した判断処理の結果、実行できないと判断した場合、第一引数で指定した処理は動きません。

  •  以下のサンプルで言うと、CanUpdate メソッドの判定結果が False の場合、Update メソッドは動きません。 その CanUpdate メソッドでは、「入力文字列が空欄ではないかどうか」をチェックしています。

  • Public Property UpdateCommand As DelegateCommand
    
    ' コンストラクタ
    Public Sub New()
    
        Me.UpdateCommand = New DelegateCommand(AddressOf Me.Update, AddressOf Me.CanUpdate)
    
    End Sub
    
    Private Sub Update()
    
        Console.WriteLine("Click!")
    
    End Sub
    
    Private Function CanUpdate() As Boolean
    
        Return Not String.IsNullOrWhiteSpace(Me.HelloText)
    
    End Function
    

  •  通常、コマンドは何らかのコントロールにバインドして使いますが、処理が実行できない時は、 バインド中のコントロールをグレーアウトにする機能があります。

  •  また、【実行できるかどうかの判断処理】は、一度しか動作しないため、任意の場所で都度判定処理を再実行する必要があります。 そのため、今回のサンプルでは、入力欄へ入力した文字列が変更されたタイミングで、再判定をおこなっています。

  • Private _HelloText As String
    Public Property HelloText() As String
        Get
            Return _HelloText
        End Get
        Set(ByVal value As String)
            Me.SetProperty(_HelloText, value)
            ' 入力文字が変更されたタイミングで、実行可否処理の再判断を手動実行
            Me.UpdateCommand.RaiseCanExecuteChanged()
        End Set
    End Property
    

  •  このサンプルを実行すると、入力欄へ1文字以上入力されている時だけボタンが押せて、何も入力していない時はボタンが押せなくなります。

  • スポンサーリンク


  •  それでは、以下ソース全体です。
  •  今回は、WPF アプリケーションプロジェクトだけです。

  •  Window1ViewModel.vb

  • Imports Prism.Mvvm
    Imports Prism.Commands
    
    Namespace ViewModels
    
        Public Class Window1ViewModel
            Inherits BindableBase
    
            Private _HelloText As String
            Public Property HelloText() As String
                Get
                    Return _HelloText
                End Get
                Set(ByVal value As String)
                    Me.SetProperty(_HelloText, value)
                    ' 入力文字が変更されたタイミングで、実行可否処理の再判断を手動実行
                    Me.UpdateCommand.RaiseCanExecuteChanged()
                End Set
            End Property
    
            ' 遅延実行(ボタンを押されたときにインスタンス生成)せずに、
            ' コンストラクタ時にインスタンス生成してもいい
            Public Property UpdateCommand As DelegateCommand
    
            ' コンストラクタ
            Public Sub New()
    
                Me.UpdateCommand = New DelegateCommand(AddressOf Me.Update, AddressOf Me.CanUpdate)
    
            End Sub
    
            Private Sub Update()
    
                Console.WriteLine("Click!")
    
            End Sub
    
            Private Function CanUpdate() As Boolean
    
                Return Not String.IsNullOrWhiteSpace(Me.HelloText)
    
            End Function
    
        End Class
    
    End Namespace
    

  •  Window1.xaml
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  • <Window x:Class="Views.Window1"
            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:WpfApplication1.Views"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            mc:Ignorable="d"
            Title="Window1" Height="350" Width="525">
    
        <StackPanel>
    
            <TextBox Text="{Binding HelloText, UpdateSourceTrigger=PropertyChanged}" />
            <Button Content="更新" Command="{Binding UpdateCommand}" />
    
        </StackPanel>
        
    </Window>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports WpfApplication1.Views
    
    Public Class Bootstrapper
        Inherits UnityBootstrapper
    
        ' Shell 担当になる View のインスタンスを返却
        Protected Overrides Function CreateShell() As DependencyObject
            Return Me.Container.Resolve(Of Window1)
        End Function
    
        ' Shell 担当になる View を表示
        Protected Overrides Sub InitializeShell()
            Application.Current.MainWindow.Show()
        End Sub
    
    End Class
    

  •  Application.xaml.vb
  •  ※Application.xaml では、【StartupUri="MainWindow.xaml"】を削除しています。

  • Class Application
    
        ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
        ' このファイルで処理できます。
    
        Protected Overrides Sub OnStartup(e As StartupEventArgs)
            MyBase.OnStartup(e)
    
            ' Unity 管理による Prism アプリケーションの起動制御処理を実行
            Dim boot = New Bootstrapper
            boot.Run()
    
        End Sub
    
    End Class