.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}"/>
🙏🙏🙏🙏🙏