回答編集履歴

2

見直しキャンペーン中

2023/08/12 10:16

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,6 +1,6 @@
1
1
  詳細がわからないので全部適当ですが、ポイントは`ItemViewModel`に`IsEnabled`を用意することです(命名はふさわしいものに変えてください)
2
2
 
3
- `View`に必要なプロパティを供給するのが、`ViewModel`の役割です。
3
+ Viewに必要なプロパティを供給するのが、ViewModelの役割です。
4
4
  もっと複雑な条件だったとしてもやることは同じです。
5
5
 
6
6
  ```xml

1

見直しキャンペーン中

2023/07/23 07:00

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,211 +1,106 @@
1
1
  詳細がわからないので全部適当ですが、ポイントは`ItemViewModel`に`IsEnabled`を用意することです(命名はふさわしいものに変えてください)
2
2
 
3
-
4
-
5
3
  `View`に必要なプロパティを供給するのが、`ViewModel`の役割です。
6
-
7
4
  もっと複雑な条件だったとしてもやることは同じです。
8
5
 
9
-
10
-
11
- ```xaml
6
+ ```xml
12
-
13
7
  <Window
14
-
15
8
  x:Class="Questions294197.MainWindow"
16
-
17
9
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
18
-
19
10
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
20
-
21
11
  Width="800"
22
-
23
12
  Height="450">
24
-
25
13
  <DockPanel>
26
-
27
14
  <StackPanel DockPanel.Dock="Bottom" Margin="5">
28
-
29
15
  <HeaderedContentControl Header="Name">
30
-
31
16
  <!-- ItemViewModelのNameの編集 -->
32
-
33
17
  <TextBox Text="{Binding Items/Name, UpdateSourceTrigger=PropertyChanged}" />
34
-
35
18
  </HeaderedContentControl>
36
-
37
19
  <HeaderedContentControl Header="IsChecked">
38
-
39
20
  <!-- ItemViewModelのIsCheckedの編集 -->
40
-
41
21
  <CheckBox IsChecked="{Binding Items/IsChecked}" />
42
-
43
22
  </HeaderedContentControl>
44
-
45
23
  <HeaderedContentControl Header="IsEnabled">
46
-
47
24
  <!-- ItemViewModelのIsEnabledは読み取り専用なので編集不可 -->
48
-
49
25
  <CheckBox IsChecked="{Binding Items/IsEnabled, Mode=OneWay}" IsEnabled="False" />
50
-
51
26
  </HeaderedContentControl>
52
-
53
27
  </StackPanel>
54
28
 
55
-
56
-
57
29
  <ListView IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Items}">
58
-
59
30
  <ListView.View>
60
-
61
31
  <GridView>
62
-
63
32
  <GridViewColumn>
64
-
65
33
  <GridViewColumn.CellTemplate>
66
-
67
34
  <DataTemplate>
68
-
69
35
  <!-- CheckBoxのIsEnabledを、ItemViewModelのIsEnabledとバインド -->
70
-
71
36
  <CheckBox IsChecked="{Binding IsChecked}" IsEnabled="{Binding IsEnabled}" />
72
-
73
37
  </DataTemplate>
74
-
75
38
  </GridViewColumn.CellTemplate>
76
-
77
39
  </GridViewColumn>
78
-
79
40
  <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" />
80
-
81
41
  <GridViewColumn DisplayMemberBinding="{Binding IsChecked}" Header="IsChecked" />
82
-
83
42
  <GridViewColumn DisplayMemberBinding="{Binding IsEnabled}" Header="IsEnabled" />
84
-
85
43
  </GridView>
86
-
87
44
  </ListView.View>
88
-
89
45
  </ListView>
90
-
91
46
  </DockPanel>
92
-
93
47
  </Window>
94
-
95
48
  ```
96
49
 
97
-
98
-
99
- ```C#
50
+ ```cs
100
-
101
51
  using System.Collections.ObjectModel;
102
-
103
52
  using System.ComponentModel;
104
-
105
53
  using System.Runtime.CompilerServices;
106
-
107
54
  using System.Windows;
108
55
 
109
-
110
-
111
56
  namespace Questions294197
112
-
113
57
  {
114
-
115
58
  public class ItemViewModel : INotifyPropertyChanged
116
-
117
59
  {
118
-
119
60
  private string _Name;
120
-
121
61
  public string Name
122
-
123
62
  {
124
-
125
63
  get => _Name;
126
-
127
64
  set
128
-
129
65
  {
130
-
131
66
  // Nameが変わったときにIsEnabledも変わった(かもしれない)ことを通知
132
-
133
67
  if(Set(ref _Name, value)) OnPropertyChanged(nameof(IsEnabled));
134
-
135
68
  }
136
-
137
69
  }
138
70
 
139
-
140
-
141
71
  // 例えばNameに何か入力がないとチェックを変えられないようにする
142
-
143
72
  public bool IsEnabled => !string.IsNullOrEmpty(Name);
144
73
 
145
-
146
-
147
74
  private bool _IsChecked;
148
-
149
75
  public bool IsChecked { get => _IsChecked; set => Set(ref _IsChecked, value); }
150
76
 
151
-
152
-
153
77
  #region INotifyPropertyChanged
154
-
155
78
  public event PropertyChangedEventHandler PropertyChanged;
156
-
157
79
  protected bool Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
158
-
159
80
  {
160
-
161
81
  if(Equals(storage, value)) return false;
162
-
163
82
  storage = value;
164
-
165
83
  OnPropertyChanged(propertyName);
166
-
167
84
  return true;
168
-
169
85
  }
170
-
171
86
  protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
172
-
173
87
  #endregion
174
-
175
88
  }
176
89
 
177
-
178
-
179
90
  public partial class MainWindow : Window
180
-
181
91
  {
182
-
183
92
  public ObservableCollection<ItemViewModel> Items { get; }
184
-
185
93
  public MainWindow()
186
-
187
94
  {
188
-
189
95
  InitializeComponent();
190
-
191
96
  DataContext = this;
192
-
193
97
  Items = new ObservableCollection<ItemViewModel>
194
-
195
98
  {
196
-
197
99
  new ItemViewModel { },
198
-
199
100
  new ItemViewModel { Name = "bbb", },
200
-
201
101
  new ItemViewModel { Name = "ccc", IsChecked = true, },
202
-
203
102
  };
204
-
205
103
  }
206
-
207
104
  }
208
-
209
105
  }
210
-
211
106
  ```