.net WPF DataGrid TemplateColumn带有复选框,并使用MVVM Light在标题中选择All-checkbox

.net WPF DataGrid TemplateColumn带有复选框,并使用MVVM Light在标题中选择All-checkbox,.net,wpf,data-binding,mvvm-light,datagridtemplatecolumn,.net,Wpf,Data Binding,Mvvm Light,Datagridtemplatecolumn,我正在尝试创建一个带有一列复选框的数据网格。在该复选框列的标题上,我希望有一个“check/uncheckall”类型的复选框 应用程序正在使用WPF、.NET 4和MVVM Light 代码如下: XAML: 我的想法是将DataGrid绑定到ReportListItemModel类型的ObservableCollection。ReportListItemModel包含一个公共布尔属性“IsSelected”,我想将其绑定到复选框 场景: 作为用户,我希望能够通过单击位于标题行的复选框来选择

我正在尝试创建一个带有一列复选框的数据网格。在该复选框列的标题上,我希望有一个“check/uncheckall”类型的复选框

应用程序正在使用WPF、.NET 4和MVVM Light

代码如下:

XAML:

我的想法是将DataGrid绑定到ReportListItemModel类型的ObservableCollection。ReportListItemModel包含一个公共布尔属性“IsSelected”,我想将其绑定到复选框


场景:
作为用户,我希望能够通过单击位于标题行的复选框来选择(或取消选择)所有行


测试:
任务:未选中状态时,单击“标题复选框”。
预期:选中单个行上的所有复选框。
实际:仅选中标题行上的复选框

任务:选中状态后,单击“标题复选框”。
应为:取消选中单个行上的所有复选框。
实际:只有标题行上的复选框未选中


“全选”复选框和行上的复选框都会使模型中的属性按预期设置。这不受视图的约束。我有一种令人毛骨悚然的感觉,我的模型和viewmodel设置得很有趣,尽管DataGridTextColumn确实从模型a-ok获得了值

我很高兴提供任何额外的代码或所需的信息

注意,我刚刚开始使用WPF、MVVM等,所以如果这里有一些基本缺陷,我很高兴听到

编辑:

为可读性而编辑…

如果您从INotifyPropertyChanged派生了
ReportListItemModel
,则从
IsSelected
属性设置器引发属性更改事件:
RaisePropertyChange(“IsSelected”)

ViewModel类派生自MVVMLight框架的ViewModelBase,好的,然后尝试为IsSelected属性引发属性更改事件。嗯,我开始看到问题了。IsSelected属性不在ViewModel中,而是在作为poco的模型中。我应该如何重构代码以在ViewModel中具有特定于行的IsSelected属性?编辑:我应该创建一个单独的ViewModel来包含一行吗。其中一个“感觉愚蠢”——在这里,我真的不知道为什么我没有像其他人一样实现应用程序的这一部分:-)谢谢!您是否有机会提供更新的解决方案,并将其标记为所有人都可以看到的答案?谢谢!
<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;
        }
    }
}