.net/XAML: bool を反転して Binding したかっただけなんだ
XAML で UI を作っていたんだ。
<!-- こういう事したかっただけなんだ -->
<CheckBox IsChecked="{Binding Awabi}"/>
<CheckBox IsEnabled="{Binding !Awabi}"/>
先日の 「.net/XAML/C#: XAML のプロパティーは Visibility 型だけど Boolean の DataContext に束縛したい場合の最適解、あるいは BooleanToVisibilityConverter について」 の例から IValueConverter を実装した InverseBooleanConverter 作ればできるのはわかる。わかるんじゃが…ここだけの為にそんな実装書きたくないでござる、とか思って bool の Not くらいなんとかならんのかと 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 して XAML の Window に参照を追加するだけで思い描いた理想の ! がほんとうに使えるようになってしまう。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}"/>
🙏🙏🙏🙏🙏