2016-05-04 6 views
0

Я работаю над wpf (архитектура mvvm). Я использую datagrid, чтобы перечислить флажки и флажок SELECT ALL в заголовке, щелчок которого я хочу, чтобы все флажки были проверены и наоборот. Пожалуйста, помогите.выберите все флажок в заголовке datagrid и его привязку в wpf mvvm

Я даю мое описание кода здесь ... Это View.xaml

<DataGridCheckBoxColumn Binding="{Binding IsSelected}" Width="50" > 
    <DataGridCheckBoxColumn.HeaderTemplate> 
     <DataTemplate x:Name="dtAllChkBx"> 
      <CheckBox Name="cbxAll" Content="All" IsChecked="{Binding Path=DataContext.AllSelected,RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
     </DataTemplate> 
    </DataGridCheckBoxColumn.HeaderTemplate> 
</DataGridCheckBoxColumn> 
<DataGridTemplateColumn Header="Name" Width="SizeToCells" IsReadOnly="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding UsecaseName}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn>    

Ниже -класс ViewModel

private bool _IsSelected; 
public bool IsSelected 
{ 
    get { return _IsSelected; } 
    set 
    { 
     _IsSelected = value; 
     OnPropertyChanged("IsSelected"); 
    } 
} 

private bool _AllSelected; 
public bool AllSelected 
{ 
    get { return _AllSelected; } 
    set 
    { 
     _AllSelected = value; 
     foreach (var reportListItemModel in UsecaseListItems) 
     { 
      reportListItemModel.IsSelected = this._AllSelected; 
     } 
     OnPropertyChanged("IsSelected"); 

    } 
} 

private ObservableCollection<UseCase> _usecaseListItems = new ObservableCollection<UseCase>(); 
public ObservableCollection<UseCase> UsecaseListItems 
{ 
    get { return _usecaseListItems; } 
    set { 
     _usecaseListItems = value; 
     OnPropertyChanged("UsecaseListItems"); 
    } 
} 

общественного класса UseCase: BaseNotifyPropertyChanged { общественного string UsecaseName {get; задавать; }

public bool IsSelected { get; set; } 

} 

Что еще нужно сделать, чтобы флажок «Выбрать все» работал правильно?

+0

Возможный дубликат: http://stackoverflow.com/questions/36999708/how-to-get-the-value-from-a-template-column-in-a-wpf-datagrid/37000291?noredirect=1# comment61553849_37000291 –

+0

Да .. Он работает сейчас .. :) –

ответ

1

вы UseCase Класс должен реализовывать INotifyPropertyChanged Интерфейс

public class UseCase : INotifyPropertyChanged 
{ 
    //... 
    private bool _isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      _isSelected = value; 
      NotifyPropertyChanged("IsSelected"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

Редактировать: Здесь я получаю полный пример, который хорошо работает

* .xaml (View)

<DataGrid x:Name="dataGrid" ItemsSource="{Binding MyCollection}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridCheckBoxColumn Binding="{Binding IsSelected}" Width="50" > 
      <DataGridCheckBoxColumn.HeaderTemplate> 
       <DataTemplate x:Name="dtAllChkBx"> 
        <CheckBox Name="cbxAll" DataContext="{Binding ElementName=dataGrid, Path=DataContext}" Command="{Binding MyCommand}" CommandParameter="{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}"/> 
       </DataTemplate> 
      </DataGridCheckBoxColumn.HeaderTemplate> 
     </DataGridCheckBoxColumn> 
     <DataGridTemplateColumn Header="Name" Width="SizeToCells" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding UsecaseName}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

* .cs (ViewModel)

public class MainViewModel : INotifyPropertyChanged 
{ 
    public MainViewModel() 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      MyCollection.Add(new UseCase { UsecaseName = "name " + i, IsSelected = false }); 
     } 
     MyCommand = new RelayCommand(MyCommandAction); 
    } 


    private ObservableCollection<UseCase> myCollection = new ObservableCollection<UseCase>(); 

    public ObservableCollection<UseCase> MyCollection 
    { 
     get 
     { 
      return myCollection; 
     } 
     set 
     { 
      myCollection = value; 
      NotifyPropertyChanged("MyCollection"); 
     } 
    } 

    public RelayCommand MyCommand { get; set; } 
    private void MyCommandAction(object obj) 
    { 
     foreach (var item in MyCollection) 
     { 
      item.IsSelected = (bool)obj; 
     } 
    } 



    //NotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

* .cs (модель)

public class UseCase : INotifyPropertyChanged 
{ 
    public string UsecaseName { get; set; } 
    private bool _isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      _isSelected = value; 
      NotifyPropertyChanged("IsSelected"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 
+0

Я уже реализовал (INotifyPropertyChanged). Когда я проверяю, что половина списка (который присутствует в нижней части полосы прокрутки) проверяется только, и когда я снова прокручиваю ее, проверяются остальные флажки. –

+0

Можете ли вы показать нам класс UseCase – Amine

+0

@ankitakumari, чтобы увидеть мой пример и попробовать его. Она будет работать – Amine

0

Вы можете использовать RegisteredAttachedProperty, чтобы сделать это возможным. Here, вы можете найти образец. вы можете быть вдохновлены оттуда.