WPF DataGrid TemplateColumn с CheckBoxes и Select All -checkbox в заголовке, используя MVVM Light - PullRequest
2 голосов
/ 17 апреля 2011

Я пытаюсь создать DataGrid со столбцом флажков.В заголовке этого столбца CheckBox я хотел бы иметь флажок типа "проверить / снять все".

Приложение использует 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>

...

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 с коллекцией ObservableColpe типа ReportListItemModel.ReportListItemModel содержит публичное логическое свойство «IsSelected», которое я хочу привязать к флажку.


Сценарий:
Как пользователь, я хочу иметь возможностьвыберите (или отмените выбор) все строки, установив флажок, расположенный в строке заголовка.


Тесты:
Задача: нажмите «Заголовок-флажок», когдаего состояние не проверено.
Ожидается: все флажки в отдельных строках отмечены.
Фактически: проверяется только флажок в строке заголовка.

Задача: когда флажок установлен, щелкните «Заголовок-флажок».проверено состояние.
Ожидается: все флажки в отдельных строках не отмечены.
Фактически: снимается только флажок в строке заголовка.


И флажок «выбрать все», и флажки в строках приводят к тому, что свойство в модели устанавливается в соответствии с ожиданиями.Это просто не связано с видом.У меня есть жуткое ощущение, что моя модель и модель представления каким-то образом смешны, хотя DataGridTextColumn действительно получает значение от модели a-ok.

Я рад предоставить любой дополнительный требуемый код или информацию!

NB. Я только начинаю с WPF, MVVM и т. Д., Поэтому, если здесь есть какой-то фундаментальный недостаток, я буду рад услышать об этом.

Редактировать:
Отредактированодля удобства чтения ...

1 Ответ

1 голос
/ 17 апреля 2011

Если вы получили ReportListItemModel из INotifyPropertyChanged, то вызовите событие изменения свойства из IsSelected setter свойства: RaisePropertyChange("IsSelected").

...