我正在尝试使用一列复选框创建一个 DataGrid。在该复选框列的标题上,我想要一个“选中/取消选中所有”类型的复选框。
应用程序正在使用 WPF、.NET 4 和 MVVM Light。
这是代码:
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>
...
视图模型:
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”,我想将其绑定到复选框。
场景:
作为用户,我希望能够通过单击位于标题行的复选框来选择(或取消选择)所有行。
测试:
任务:单击“标题复选框”,当它的状态未选中时。
预期:选中各个行上的所有复选框。
实际:仅选中标题行上的复选框。
任务:点击“Header-Checkbox”,当它的状态被选中时。
预期:单个行上的所有复选框都未选中。
实际:只有标题行上的复选框未被选中。
“全选”复选框和行上的复选框都会导致模型中的属性按预期设置。这只是没有绑定到视图。我有一种令人毛骨悚然的感觉,即我的模型和视图模型以某种方式设置得很有趣,即使 DataGridTextColumn 确实从模型 a-ok 中获得了值。
我很乐意提供所需的任何其他代码或信息!
注意我刚刚开始使用 WPF、MVVM 等,所以如果这里有一些基本缺陷,我很高兴听到它。
编辑:
为便于阅读而编辑...