C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

.net/XAML: bool を反転して Binding したかっただけなんだ

XAML で UI を作っていたんだ。

<!-- こういう事したかっただけなんだ -->
<CheckBox IsChecked="{Binding Awabi}"/>
<CheckBox IsEnabled="{Binding !Awabi}"/>

先日の 「.net/XAML/C#: XAML のプロパティーは Visibility 型だけど Boolean の DataContext に束縛したい場合の最適解、あるいは BooleanToVisibilityConverter について」 の例から IValueConverter を実装した InverseBooleanConverter 作ればできるのはわかる。わかるんじゃが…ここだけの為にそんな実装書きたくないでござる、とか思って boolNot くらいなんとかならんのかと stackoverflow を眺めたわけですよ。

 [ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(bool?))
        {
            throw new InvalidOperationException("The target must be a nullable boolean");
        }
        bool? b = (bool?)value;
        return b.HasValue && !b.Value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !(value as bool?);
    }

    #endregion
}

はぁーーーーー書くのめんどくさいでござるぅーーー(コピペするだけなんだけど「たったの ! したいだけ」のためにこんなにプロジェクトにソースコード増やしたくないでござるぅー…)

と、思って、もうちょっと良い方法かつトリッキーじゃなくて DataContext に放り込む値は bool そのままで使える方法は…とスクローリングしたわけですよ。

<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />
<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>
<Label Content="{c:Binding A+B+C }" />
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />

『あなたが(XAMLの)神か🙏』

この神 Answer をしてくれっていた Alex141 はこのライブラリー Alex141/CalcBinding の Author さんのようだ。プロジェクトの References へ Manage NuGet Packages から CalcBinding を install して XAMLWindow に参照を追加するだけで思い描いた理想の ! がほんとうに使えるようになってしまう。XAMLの真髄をすすってる感があってたいへんXAMLだ。

<Window 
  xmlns:c="clr-namespace:CalcBinding;assembly=CalcBinding"
<!-- こういう事したかっただけなんだ
  <CheckBox IsChecked="{Binding Awabi}"/>
  <CheckBox IsEnabled="{Binding !Awabi}"/>
 -->
<!-- かなり理想郷に近いぞ!!!😂 -->
  <CheckBox IsChecked="{Binding Awabi}"/>
  <CheckBox IsEnabled="{c:Binding !Awabi}"/>

🙏🙏🙏🙏🙏