2016-07-26 1952 views
1

我有一个DataGrid,其中一些行基于网格项目的属性被禁用...在WPF DataGrid中防止禁用行被选中

<DataGrid ItemsSource="{Binding Items}"> 
    <DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Enabled}" Value="False"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

我想防止非法行从被选中。在上面的例子中,你不能通过点击来选择禁用的行,但有其他的选择方式,例如,Ctrl-A选择所有的行,包括禁用的行,选择一个启用的行,然后shift-点击另一个启用的行也将选择他们之间的任何禁用行等...

有没有办法阻止被禁用的行被选中? (例如,Ctrl-A只会选择启用行)

+0

我不知道你是否可以将它们绑定到一个可观察的集合,并且OnCollectionChanged会过滤出你不想要的那些? – Joe

回答

1

您必须处理DataGridSelectedCellsChanged事件。在下面的示例中,我使用了Student对象列表,其中包含Enabled属性。

private void Dgrd_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
     {   
      foreach(DataGridCellInfo info in e.AddedCells) 
      { 
       if (info.Item is Student && ((Student)info.Item).Enabled == false)      
        ((DataGridRow)Dgrd.ItemContainerGenerator.ContainerFromItem(info.Item)).IsSelected = false;      
      } 
     } 

我检查了它,它解决了您的问题中提到的所有问题。