VB のたまご

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



VisibilityAndBooleanConverter

  •  ここでは、コンバーター(IValueConverter を継承して扱う)の VisibilityAndBooleanConverter を学習します。

  • その前に、まずはコンバートについて簡単に説明します。 xaml 上では、文字列も数字も列挙体も、あらゆる型の値を「文字列」で指定できます。しかし、文字列のままで実際の処理を行うことはできません。

  •  例えば、IsEnabled プロパティというコントロールの活性制御をおこなうプロパティがありますが、このプロパティには「True」か「False」をセットできます。 xaml 上では文字列で扱えますが、実際の型は「Boolean」ですので、文字列をセットできません。

  • そこでコンバートの出番となります。 String と Boolean を相互変換するコンバーターを用意しておき、このコンバーターに窓口になってもらうことで、実際の型に値をセットすることが可能になります。

  •  これと同じことで、Visibility 列挙体と Boolean を相互変換するコンバーターが VisibilityAndBooleanConverter です。 コンバーターの良いところは、「緩衝材になってくれる」という特徴です。 今回のサンプルで言うと、画面操作では Visibility で扱うけど、DB 側では Boolean で扱いたい等、必ずしも扱う型が同じとは限りません。 このような場合にコンバートが大活躍します。

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

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

    <Window x:Class="Views.VisibilityAndBooleanConverterWindow1"
            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="VisibilityAndBooleanConverterWindow1" Height="350" Width="525">
        
        <Window.DataContext>
            <vm:VisibilityAndBooleanConverterWindow1ViewModel/>
        </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>
    
            <!-- button2 の表示状態を切り替えるボタン -->
            <Button Content="button1">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Click" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
    
            <!-- Visibility プロパティと (モデルで準備した)IsVisible プロパティを相互変換するコンバーターのサンプル -->
            <Button Content="button2">
                <Button.Visibility>
                    <Binding Path="IsVisible">
                        <Binding.Converter>
                            <l:VisibilityAndBooleanConverter
                                ConvertWhenTrue="Visible"
                                ConvertWhenFalse="Hidden"
                                ConvertBackDefaultBooleanValue="True"
                                ConvertBackWhenHidden="False" />
                        </Binding.Converter>
                    </Binding>
                </Button.Visibility>
            </Button>
    
        </StackPanel>
    
    </Window>
    

  •  このサンプルでは、button1 ボタンを押すたびに、button2 ボタンの表示/非表示を切り替えるサンプルです。 button2 ボタンの Visibility 列挙体プロパティに ViewModel で用意した IsVisible Boolean プロパティをバインドしています。 ただし、このままだと型違いでバインドできないため、コンバーターを挟んでいます。

  •  ConvertXxx プロパティで、VM / IsVisible プロパティ → V / Visibility プロパティへの変換を、 ConvertBackXxx プロパティで、V / Visibility プロパティ → VM / IsVisible プロパティへの変換をおこないます。

  •  Visibility 列挙体には Collapsed もあるのですが、今回は出番無しの扱いです。

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

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