実現したいこと
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内では変更ができないのでしょうか?教えてください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。