带有CheckBoxes的WPF DataGrid TemplateColumn和使用MVVM Light的标题中的Select All -checkbox

时间:2011-04-17 15:31:31

标签: .net wpf data-binding mvvm-light datagridtemplatecolumn

我正在尝试使用一列复选框创建一个DataGrid。在CheckBox-column的标题上,我想要一个“check / uncheck all”类型的复选框。

App正在使用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”,我想绑定到该复选框。


情境:
作为用户,我希望能够通过单击标题行上的复选框来选择(或取消选择)所有行。


试验:
任务:当未选中状态时,单击“标题 - 复选框” 预期:检查各行的所有复选框 实际:仅检查标题行上的复选框。

任务:在选中状态时单击“标题 - 复选框” 预期:未选中各行的所有复选框 实际:仅取消选中标题行上的复选框。


“select all”-checkbox和行上的checbox都会导致模型中的属性按预期设置。这只是不受视图的约束。我有一种令人毛骨悚然的感觉,即使DataGridTextColumn确实从模型a-ok获取值,我的模型和viewmodel设置也很有趣。

我很乐意提供所需的任何其他代码或信息!

N.B。我刚刚开始使用WPF,MVVM等,所以如果这里有一些根本性的缺陷,我会很高兴听到它。

编辑:
编辑可读性......

1 个答案:

答案 0 :(得分:1)

如果您从INotifyPropertyChanged派生了 ReportListItemModel ,则从 IsSelected 属性设置器RaisePropertyChange("IsSelected")中提升属性更改事件。