VB のたまご

作成日: 2017/04/07, 更新日: 2017/04/07



ButtonSetStateToSourceAction

  •  ここでは、トリガーアクションである ButtonSetStateToSourceAction について学習します。 WPF のコントロールは、全てのプロパティは公開していないことが多いです。例えば Button クラスの IsFocused プロパティです。 現在、自分にフォーカスが当たっているかどうかを判定するプロパティですね。この IsFocused プロパティは非公開プロパティなので、xaml 上で扱うことができません。

  • これを可能にするのが、ButtonSetStateToSourceAction です。 以下のサンプルを見てみましょう。このサンプルでは、「Livet WPF4.5 MVVM アプリケーション」より作成したもので、ViewModel と View を作成しています。

  • Namespace ViewModels
    
        Public Class ButtonSetStateToSourceActionWindow1ViewModel
            Inherits ViewModel
    
    
    #Region "IsFocused変更通知プロパティ"
            Private _IsFocused As Boolean
    
            Public Property IsFocused() As Boolean
                Get
                    Return _IsFocused
                End Get
                Set(ByVal value As Boolean)
                    If (_IsFocused = value) Then Return
                    _IsFocused = value
                    RaisePropertyChanged()
                    Console.WriteLine($"{value} に変わりました")
                End Set
            End Property
    #End Region
    
            Public Sub Initialize()
            End Sub
    
        End Class
    
    End Namespace
    

    <Window x:Class="Views.ButtonSetStateToSourceActionWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
            xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
            xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
            xmlns:v="clr-namespace:w01_LivetFeature.Views"
            xmlns:vm="clr-namespace:w01_LivetFeature.ViewModels"
            Title="ButtonSetStateToSourceActionWindow1" Height="350" Width="525">
        
        <Window.DataContext>
            <vm:ButtonSetStateToSourceActionWindow1ViewModel/>
        </Window.DataContext>
        
         <i:Interaction.Triggers>
         
            <!--WindowのContentRenderedイベントのタイミングでViewModelのInitializeメソッドが呼ばれます-->
            <i:EventTrigger EventName="ContentRendered">
                <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/>
            </i:EventTrigger>
    
            <!--Windowが閉じたタイミングでViewModelのDisposeメソッドが呼ばれます-->
            <i:EventTrigger EventName="Closed">
                <l:DataContextDisposeAction/>
            </i:EventTrigger>
    
            <!--WindowのCloseキャンセル処理に対応する場合は、WindowCloseCancelBehaviorの使用を検討してください-->
    
        </i:Interaction.Triggers>
        
        <StackPanel>
    
            <TextBlock Text="Tab キーを押して、フォーカス移動してください" Margin="0,0,0,20" />
    
            <TextBox />
    
            <!-- IsFocused プロパティは本来は非公開メンバー。OneWayToSource としてモデルにバインドする -->
            <Button Content="buton1">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="GotFocus">
                        <l:ButtonSetStateToSourceAction Property="IsFocused" Source="{Binding IsFocused}" />
                    </i:EventTrigger>
                    <i:EventTrigger EventName="LostFocus">
                        <l:ButtonSetStateToSourceAction Property="IsFocused" Source="{Binding IsFocused}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
    
        </StackPanel>
        
    </Window>
    

  • このサンプルを実行して、タブキーを押してフォーカス遷移してみましょう。ボタンにフォーカスが当たっている場合は True、フォーカスが外れた場合は False と出力されます。 これは、Button クラスの IsFocused プロパティの値を、ViewModel クラスで用意した IsFocused プロパティにバインドさせて、値を取得しているためです。 取得のタイミングは、フォーカスを得た時に発生する GotFocus イベントと、フォーカスを失った時に発生する LostFocus イベントを監視して取得します。 便利ですね。

  • 本サンプルは、GitHub にアップしていますので、完全なソースは以下をご覧ください。

  • GitHub
    https://github.com/sutefu7/VbWpfSamples.Other
    w01_LivetFeature