2016-07-26 36 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;      
      } 
     } 

我檢查了它,它解決了您的問題中提到的所有問題。