質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

2018閲覧

WPF チェックボックスの非活性化

Ryosuke02

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2022/08/19 03:01

実現したいこと

MVVMでBindingを使用し、チェックボックスのチェックが入ったときに非活性化、
チェックが外れた時に活性化したいです。

発生している問題・エラーメッセージ

活性化と非活性化が逆になってしまいます。

該当のソースコード

using System.ComponentModel; using System.Runtime.CompilerServices; namespace Sample { public class ViewModel : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //TextBoxの入力可否用のプロパティ private bool _IsEdit = false; public bool IsEdit { get { return _IsEdit; } set { if (_IsEdit != value) { _IsEdit = value; RaisePropertyChanged(); } } } }

補足情報(FW/ツールのバージョンなど)

Visual Studio2019を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

活性化と非活性化が逆になってしまいます。

こうなっているということですか?そりゃそうですよね。

xml

1<Window 2 x:Class="Qt1azib5jefloqu.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Qt1azib5jefloqu" 6 Width="800" 7 Height="450"> 8 <Window.DataContext> 9 <local:ViewModel /> 10 </Window.DataContext> 11 <StackPanel> 12 <CheckBox Content="編集不可" IsChecked="{Binding IsEdit}" /> 13 <TextBox IsEnabled="{Binding IsEdit}" Text="aaa" /> 14 </StackPanel> 15</Window>

案1 チェックボックスの論理を逆にする

<CheckBox Content="編集可"
話が早いがおそらくそれは嫌なのでしょう。

案2 ViewModelにIsNotEditも用意する

バカバカしいしわかりにくい。

cs

1//TextBoxの入力可否用のプロパティ 2public bool IsEdit => !IsNotEdit; 3private bool _IsNotEdit; 4public bool IsNotEdit 5{ 6 get => _IsNotEdit; 7 set 8 { 9 if (_IsNotEdit != value) 10 { 11 _IsNotEdit = value; 12 RaisePropertyChanged(); 13 RaisePropertyChanged(nameof(IsEdit)); 14 } 15 } 16}

xml

1<CheckBox Content="編集不可" IsChecked="{Binding IsNotEdit}" /> 2<TextBox IsEnabled="{Binding IsEdit}" Text="aaa" />

案3 反転するコンバータ

wpf bool 反転 converter - Google 検索

昔はInverseBooleanConverterが多かったですが、BoolNegationConverterがはやり?のようなので合わせましたw
BoolNegationConverter Class (CommunityToolkit.WinUI.UI.Converters) | Microsoft Docs

xml

1<Window 2 x:Class="Qt1azib5jefloqu.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Qt1azib5jefloqu" 6 Width="800" 7 Height="450"> 8 <Window.Resources> 9 <local:BoolNegationConverter x:Key="BoolNegationConverter" /> 10 </Window.Resources> 11 <Window.DataContext> 12 <local:ViewModel /> 13 </Window.DataContext> 14 <StackPanel> 15 <CheckBox Content="編集不可" IsChecked="{Binding IsEdit, Converter={StaticResource BoolNegationConverter}}" /> 16 <TextBox IsEnabled="{Binding IsEdit}" Text="aaa" /> 17 </StackPanel> 18</Window>

cs

1public class BoolNegationConverter : IValueConverter 2{ 3 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 4 => !(value is bool && (bool)value); 5 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 6 => !(value is bool && (bool)value); 7}

リソースに登録するのが面倒な場合は、マークアップ拡張を使ったテクニックがあります。
wpf converter markupextension - Google 検索


あとはDataTriggerもありますが、長くなるだけでメリットもないので省略。

投稿2022/08/19 05:06

編集2022/08/19 05:10
TN8001

総合スコア9246

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問