2016-08-24 35 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