2016-08-24 37 views
0

嗨有一个Datagrid与rowCheckBoxes和一个标题复选框来检查所有。DataGrid checkall不工作

标题复选框将绑定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的值时,由于Contremarque没有实现INotifyPropertyChanged,因此没有任何反应。 – ebelair