teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

WPF

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

Q&A

解決済

1回答

794閲覧

WPFでボタンのIsEnabledをチェックボックスで管理したい

dfsgerehs

総合スコア4

C#

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

WPF

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

0グッド

0クリップ

投稿2023/10/23 00:56

0

0

実現したいこと

WPFでDataGrid内のボタンのIsEnabledをチェックボックスでONOFFしたいと考えています。

前提

WPFで画像のようにタブの中のDataGrid内にチェックボックスとボタンを用意して、チェックボックスが入力されているとボタンを押すことができるというシステムを作っています。
イメージ説明
しかしDataGrid内のチェックボックスをマウスで変化させてもボタンの状態が変化しません。
イメージ説明

該当のソースコード

Xaml

1<Window 2 x:Class="Tab_Check_Button.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:Tab_Check_Button.ViewModel" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Title="MainWindow" 9 Width="500" 10 Height="500" 11 mc:Ignorable="d"> 12 <Window.DataContext> 13 <local:MainViewModel /> 14 </Window.DataContext> 15 <Window.Resources> 16 <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 17 </Window.Resources> 18 19 <Grid> 20 <Grid.RowDefinitions> 21 <RowDefinition Height="*" /> 22 <RowDefinition Height="10" /> 23 </Grid.RowDefinitions> 24 <TabControl Grid.Row="0" ItemsSource="{Binding TabDataGridModel.Tab}"> 25 <!-- タブのヘッダー表示をカスタマイズするためのデータテンプレート --> 26 <TabControl.ItemTemplate> 27 <DataTemplate> 28 <Grid> 29 <TextBlock 30 HorizontalAlignment="Center" 31 VerticalAlignment="Center" 32 Text="{Binding Name}" /> 33 </Grid> 34 </DataTemplate> 35 </TabControl.ItemTemplate> 36 37 <TabControl.ContentTemplate> 38 <DataTemplate> 39 <Grid Background="#D3D3D3"> 40 <Grid.RowDefinitions> 41 <RowDefinition Height="20" /> 42 <RowDefinition Height="*" /> 43 </Grid.RowDefinitions> 44 <CheckBox Grid.Row="0" IsChecked="{Binding DataGrid[0].IsChecked}" /> 45 <DataGrid 46 Grid.Row="1" 47 AutoGenerateColumns="False" 48 CanUserAddRows="False" 49 ItemsSource="{Binding DataGrid}"> 50 <DataGrid.Columns> 51 <DataGridTemplateColumn Header="チェック"> 52 <DataGridTemplateColumn.CellTemplate> 53 <DataTemplate> 54 <StackPanel Orientation="Horizontal"> 55 <CheckBox IsChecked="{Binding IsChecked}" /> 56 </StackPanel> 57 </DataTemplate> 58 </DataGridTemplateColumn.CellTemplate> 59 </DataGridTemplateColumn> 60 <DataGridTemplateColumn Header="ボタン"> 61 <DataGridTemplateColumn.CellTemplate> 62 <DataTemplate> 63 <StackPanel Orientation="Horizontal"> 64 <Button Content="Button" IsEnabled="{Binding IsChecked}" /> 65 </StackPanel> 66 </DataTemplate> 67 </DataGridTemplateColumn.CellTemplate> 68 </DataGridTemplateColumn> 69 </DataGrid.Columns> 70 </DataGrid> 71 </Grid> 72 </DataTemplate> 73 </TabControl.ContentTemplate> 74 </TabControl> 75 <TabControl Grid.Row="1" ItemsSource="{Binding TabsModel.Tab}"> 76 </Grid> 77</Window>

C#

1using System.Collections.Generic; 2using System.ComponentModel; 3using System.Windows.Controls; 4using Tab_Check_Button.Model; 5 6namespace Tab_Check_Button.ViewModel 7{ 8 public class MainViewModel : INotifyPropertyChanged 9 { 10 /// <summary> 11 /// プロパティの変更を通知するためのマルチキャスト イベント。 12 /// </summary> 13 public event PropertyChangedEventHandler? PropertyChanged; 14 15 private TabsModel? _TabsModel; 16 private TabDataGridModel? _TabDataGridModel; 17 public MainViewModel() 18 { 19 TabDataGridModel = new TabDataGridModel() 20 { 21 Tab = new List<GridTab>() 22 { 23 new GridTab() 24 { 25 Name="tab1",DataGrid=new List<GridData> 26 { 27 new GridData() {IsChecked=true}, new GridData() {IsChecked=false} 28 } 29 }, 30 new GridTab() 31 { 32 Name="tab2",DataGrid=new List<GridData> 33 { 34 new GridData() {IsChecked=true}, new GridData() {IsChecked=true} 35 } 36 }, 37 new GridTab() 38 { 39 Name="tab3",DataGrid=new List<GridData> 40 { 41 new GridData() {IsChecked=false}, new GridData() {IsChecked=false} 42 } 43 } 44 } 45 }; 46 } 47 public TabDataGridModel TabDataGridModel 48 { 49 get { return _TabDataGridModel; } 50 set 51 { 52 _TabDataGridModel = value; 53 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TabDataGridModel))); 54 } 55 } 56 } 57}

C#

1using System.Collections.Generic; 2 3namespace Tab_Check_Button.Model 4{ 5 public class TabDataGridModel 6 { 7 public List<GridTab>? Tab { get; set; } = new List<GridTab>(); 8 } 9 public class GridTab 10 { 11 /// <summary> 12 /// タブのヘッダーに表示する名前 13 /// </summary> 14 public string? Name { get; set; } 15 /// <summary> 16 /// チェックボックスにバインディング 17 /// </summary> 18 public List<GridData>? DataGrid { get; set; } = new List<GridData>(); 19 } 20 public class GridData 21 { 22 public bool? IsChecked { get; set; } = false; 23 } 24}

試したこと

そもそもこういった挙動はできないと考え、xamlでタブの中かつDataGridの外に
<CheckBox Grid.Row="0" IsChecked="{Binding DataGrid[0].IsChecked}" />
とチェックボックスを付けたところ、ボタンのIsEnabledを変化させることができました。
このことからItemsSourceの中にItemsSourceを実装すると、
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TabDataGridModel)));
で行う外側のItemsSourceの変更通知が内側まで影響しないと予想しました。
よってViewModelが持つModelにViewModelを持たせて、別の通知機能を実装したらボタンのIsEnabledが変化できると考えましたが、が変化しませんでした。

C#

1using System.Collections.Generic; 2using Tab_Check_ButtonVer2.ViewModel; 3 4namespace Tab_Check_ButtonVer2.Model 5{ 6 public class TabsModel 7 { 8 /// <summary> 9 /// 事務所のリスト 10 /// </summary> 11 public List<Tab>? Tab { get; set; } = new List<Tab>(); 12 } 13 public class Tab 14 { 15 /// <summary> 16 /// ヘッダーに表示するマップ名 17 /// </summary> 18 public string? Name { get; set; } 19 /// <summary> 20 /// DataGridにバインディングさせるViewModel 21 /// </summary> 22 public DataGridViewModel? DataGrid { get; set; } = new DataGridViewModel(); 23 } 24}

C#

1 public class DataGridModel 2 { 3 /// <summary> 4 /// DataGridの要素 5 /// </summary> 6 public List<GridData>? DataGrid { get; set; } = new List<GridData>(); 7 } 8 public class GridData 9 { 10 /// <summary> 11 /// ボタンの名前 12 /// </summary> 13 public string ButtonName { get; set; } = "Button"; 14 /// <summary> 15 /// チェックボックス 16 /// </summary> 17 public bool IsChecked { get; set; } = false; 18 }

なぜDataGrid内では変更ができないのでしょうか?教えてください。

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

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

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

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

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

guest

回答1

0

自己解決

https://shikaku-sh.hatenablog.com/entry/wpf-custom-checkbox-not-update-binding-in-datagrid
こちらの記事を参考に、xamlのチェックチェックボックスに
<CheckBox IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
とUpdateSourceTrigger=PropertyChangedを追加したらボタンを変化させることができました。

投稿2023/10/23 03:20

dfsgerehs

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問