2016-08-24 6 views
0

Привет, у меня есть Datagrid с rowCheckBoxes и заголовок, чтобы проверить все.DataGrid checkall not working

Флажок заголовка привязывает метод в MainViewModel, который обновит свойство моих данных модели до значения true. Но флажки по-прежнему не отмечены.

<DataGrid AutoGenerateColumns="False" x:Name="grdLignes" HorizontalAlignment="Stretch" Margin="0,0,0,0" 
        VerticalAlignment="Stretch" CanUserAddRows="False" CanUserDeleteRows="False" Grid.ColumnSpan="2" 
        ItemsSource="{Binding CmLignes, UpdateSourceTrigger=PropertyChanged}"> 
      <DataGrid.Resources> 
       <Style TargetType="{x:Type DataGridRow}"> 
        <Style.Triggers> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
           <Condition Binding="{Binding Path=hasLink, Mode=OneTime}" Value="True"/> 
          </MultiDataTrigger.Conditions> 
          <Setter Property="IsEnabled" Value="False"/> 
         </MultiDataTrigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.Resources> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.Header> 
         <CheckBox Command="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=DataContext.ToggleCheckAll}" CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"/> 
        </DataGridTemplateColumn.Header> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox Name="rowCheck" VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Path=hasLink, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTextColumn Header="Ref Mag" Binding="{Binding Path=refMag}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Ref Fourn" Binding="{Binding Path=refFourn}"/> 
       <DataGridTextColumn Header="Désignation" Binding="{Binding Path=design}"/> 
       <DataGridTextColumn Header="Quantité" Binding="{Binding Path=qte, StringFormat=N2}"/> 
       <DataGridTemplateColumn Header="Fournisseur"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <!--<ComboBox ItemsSource="{Binding FournList, RelativeSource={RelativeSource AncestorType=Window}}" SelectedItem="{Binding Path=fourn}"/>--> 
          <ComboBox ItemsSource="{Binding Path=fournList}" SelectedItem="{Binding Path=selectedFourn, UpdateSourceTrigger=PropertyChanged}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTextColumn Header="Fourn princ" Binding="{Binding Path=fournPrinc}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Pièce" Binding="{Binding Path=numPiece}" IsReadOnly="True"/> 
      </DataGrid.Columns> 
     </DataGrid> 

Тогда MainViewModel:

public class MainViewModel : INotifyPropertyChanged 
{ 
    private ContremarqueRepository cmRepos; 

    private ObservableCollection<Contremarque> cmLignes; 
    public ObservableCollection<Contremarque> CmLignes 
    { 
     get { return cmLignes; } 
     set 
     { 
      cmLignes = value; 
      OnPropertyChanged("CmLignes"); 
     } 
    } 
    public ICommand ToggleCheckAll { get; set; } 
    public MainViewModel() 
    { 
     Collection<Contremarque> cms = cmRepos.getAll(doPiece); 
     CmLignes = new ObservableCollection<Contremarque>(cms); 

     ToggleCheckAll = new Command(ActionToggleCheckAll); 
    } 

    private void ActionToggleCheckAll(object param) 
    { 
     bool isChecked = (bool)param; 
     if (isChecked) 
     { 
      foreach (Contremarque contremarque in CmLignes) 
      { 
       contremarque.hasLink = true; 
      } 
     } 

     OnPropertyChanged("CmLignes"); 
    } 
} 

Это Contremarque класс:

public class Contremarque 
{ 
    public bool hasLink { get; set; } 
    public string refMag { get; set; } 
    public string refFourn { get; set; } 
    public string design { get; set; } 
    public double qte { get; set; } 
    public string fournPrinc { get; set; } 
    public List<string> fournList { get; set; } 
    public string selectedFourn { get; set; } 
    public string numPiece { get; set; } 

    public int dlNo; 

    public override string ToString() 
    { 
     string str = string.Empty; 
     foreach (var prop in this.GetType().GetProperties()) 
     { 
      str += string.Format("{0} = {1} ", prop.Name, prop.GetValue(this, null)); 
     } 

     return str; 
    } 
} 

PropertyChanged следует обновить состояние моих флажков не так ли?

ответ

0

Ваш класс Contremarque должен реализовать INotifyPropertyChanged и свойство hasLink должно выглядеть:

public class Contremarque : INotifyPropertyChanged 
{ 
    private bool _hasLink;  
    public bool hasLink 
    { 
     get { return _hasLink; } 
     set 
     { 
      _hasLink= value; 
      OnPropertyChanged(); 
     } 
    } 
    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     }   
    } 
} 
+0

Я добавил некоторые детали, так что вы можете увидеть, что mainViewModel уже реализует INotifyPropertyChanged. Все значения коллекции обновляются, но флажки не проверяются. – ebelair

+0

Понял. Однако этого недостаточно: вам также понадобится сделать свой класс, который поддерживает модель просмотра hasLink (Contremarque) тоже в соответствии с моим примером. –

+0

Он все еще не работает. hasLink является свойством класса Contremarque. Datagrid связывает коллекцию Contremarque, поэтому, когда репозиторий загружает коллекцию, Datagrid правильно заполняется. Когда данные изменяются, коллекция обновляется, но когда я программно изменяю значение Contremarque :: hasLink, ничего не происходит – ebelair