チェックボックスの列を持つDataGridを作成しようとしています。そのCheckBox-columnのヘッダーに、「すべてをチェック/チェック解除」タイプのチェックボックスを設定したいと思います。
アプリはWPF、.NET 4、MVVMLightを使用しています。
コードは次のとおりです。
XAML:
<DataGrid x:Name="dgReportList" ItemsSource="{Binding Path=ReportListItems}">
<DataGrid.Columns>
<DataGridTextColumn Header="*SomeText" Binding="{Binding Path=SourceReport.Name}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox IsChecked="{Binding Source={StaticResource Locator},
Path=MainWindowViewModel.CheckAll, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
..。
ViewModel:
private ObservableCollection<ReportListItemModel> _reportListItems;
public ObservableCollection<ReportListItemModel> ReportListItems
{
get
{
return this._reportListItems;
}
private set
{
this._reportListItems = value;
this.RaisePropertyChanged("ReportListItems");
}
}
....
public bool CheckAll
{
get { return this._checkall; }
set
{
this._checkall = value;
foreach (var reportListItemModel in ReportListItems)
{
reportListItemModel.IsSelected = this._checkall;
}
}
}
モデル:
public class ReportListItemModel
{
public EnvironmentConfigurationModel TargetConfigurationModel { get; set; }
public ReportModel TargetReport { get; set; }
public EnvironmentConfigurationModel SourceConfigurationModel { get; set; }
public ReportModel SourceReport { get; set; }
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
}
}
}
私の考えは、DataGridをタイプReportListItemModelのObservableCollectionにバインドすることです。ReportListItemModelには、チェックボックスにバインドしたいパブリックブールプロパティ「IsSelected」が含まれています。
シナリオ:
ユーザーとして、ヘッダー行にあるチェックボックスをクリックして、すべての行を選択(または選択解除)できるようにしたい。
テスト:
タスク:状態がチェックされていない場合は、[ヘッダー-チェックボックス]をクリックします。
予想:個々の行のすべてのチェックボックスがオンになります。
実際:ヘッダー行のチェックボックスのみがチェックされます。
タスク:状態がチェックされたら、[ヘッダー-チェックボックス]をクリックします。
予想:個々の行のすべてのチェックボックスがオフになります。
実際:ヘッダー行のチェックボックスのみがオフになります。
「すべて選択」チェックボックスと行のチェックボックスの両方により、モデル内のプロパティが期待どおりに設定されます。これはビューにバインドされません。DataGridTextColumnがモデルa-okから値を取得しているにもかかわらず、モデルとビューモデルがどういうわけか面白く設定されているという不気味な感じがします。
必要な追加のコードや情報を提供させていただきます。
NB私はWPF、MVVMなどを始めたばかりなので、ここに根本的な欠陥がある場合は、それについて聞いてうれしいです。
編集:
読みやすくするために編集...