読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

BooleanToCollapsedConverter

C# WindowsPhone Silverlight WPF Win8App

※いんすぱいあーどふろむ

みつばたんの資料 (P62) にある様に、 1 つの画像の表示 / 非表示をチェックボックス(トグル)の On / Off に割り当てる場合は Property Binding + Converter でいけますね*1
でも、忍さんの記事の様に Off で別の画像を表示したい場合( On / Off で画像を切り替えたい)場合は Property Binding だけではうまくいかない、と。
……で、まぁ忍さん提案のコントロール化(+ VSM で制御)で対応してもいいのだけれども、それだけのためにコントロール(テンプレート)を作るのもなんかなぁと思うわけです。
# そもそも、この方法だとシステムでテーマや共通テンプレートとかを適用しているときにうまくいかないケースがありますし。
そこで、簡易的に↓こんな Converter を作って*2逃げてます。

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace CheckboxSample.Data
{
    public class BooleanToCollapsedConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool && !(bool)value)
            {
                return Visibility.Visible;
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Visibility && (Visibility)value == Visibility.Visible)
            {
                return false;
            }

            return true;
        }
    }
}

※ストアアプリの場合は Convert / ConvertBack の引数の型が他と違うので読み替えが必要。。。

余談

ちなみに、バインドするプロパティが ViewModel 上にある場合は、↑の Converter は使わずに素直に逆値を返すプロパティを増やす事の方が多いです。 ^^;

蛇足

Windows Phone / Silverlight で使う BooleanToVisibilityConverter は↓な感じで作ってます。(ほとんど↑と一緒ですが)

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace CheckboxSample.Data
{
    public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool && (bool)value)
            {
                return Visibility.Visible;
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value is Visibility && (Visibility)value == Visibility.Visible;
        }
    }
}

*1:Silverlight / Windows Phone の場合は BooleanToVisibilityConverter がないのでそこから自作が必要ですが。。。

*2:毎回書くのが面倒だからメモ代わりに記事化しておく試みです。 :p