しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

IValueConverter

ListBox で選択されている項目が変わった時、隣で表示させる Canvas の Visibility を切り替えるために最初は SelectionChanged を処理しようと考えてました。
しかし、面倒だったので ListBoxItem の IsSelected を対象となる Canvas の Visibility にバインディングすることに。なので、bool -> Visibility のコンバータを書きました。

[ValueConversion(typeof(bool), typeof(Visibility))]
public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)value)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Hidden;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((Visibility)value == Visibility.Visible)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

単純に true の時は Visibility.Visible を、false の時は Visibility.Hidden を返すってだけの簡単なコンバータです。
これを使って ListBoxItem の IsSelected とバインディングしてやります。でもそのままじゃコンバータとして使えないので

<Window
    // いろいろ省略
    xmlns:c="clr-namespace:コンバータが属する名前空間"
    >
    <Window.Resources>
        <c:VisibilityConverter x:Key="visibilityConverter" />
    </Window.Resource>
</Window>

のようにコンバータをリソースに追加してから

<ListBox>
    <ListBoxItem Name="sampleItem">ほげほげ</ListBoxItem>
</ListBox>

<Canvas Visibility="{Binding ElementName=sampleItem, Path=IsSelected, Converter=visibilityConverter}" />

こんな感じでバインド式に、さっきリソースに追加したコンバータを指定してやればいいです。これでアイテムが選択されているときだけ Canvas が見えるようになります。
もっと賢い方法はいくらでもありそうなんだけれども、自分ではこんな方法しか浮かびませんでした。
追記
バインド式が間違っていたので修正。