2009-10-30 82 views
3

我有一个DataGrid,我将其绑定到分组和排序的PagedCollectionView。 DataGrid的内容不可编辑,尽管一列包含可点击的链接。使Silverlight Datagrid单元格不可选

我已经将DataGrid的SelectionMode限制为DataGridSelectionMode.Single,这会停止多行选择,这很好。但是选中的行也有一个选定的单元格,其颜色比所选行的其余部分略浅,并且具有边框。

基本上我想要一个SelectedRow但不是SelectedCell(从UI/Display的角度来看)。

它感觉应该是设置一个属性的简单问题,但我感觉也许我必须编辑DataGrids模板和/或与VisualStateManager混乱。

我很高兴切换到DataGrid以外的其他控件,但我确实需要能够显示分组。

回答

6

我发现'a'使单个细胞看起来没有被选中,尽管我不确定它是否是最好的方法。
编辑DataGrid的CellStyle,找到名为FocusVisual的矩形。这是用于指示选定单元格的矩形。设置其填充&笔画为透明,我也将其StrokeThickness设置为0.不要完全删除矩形,因为其他事物都期待它在那里。 XAML中看起来是这样的:

<Style x:Key="NonSelectableDataGridCellStyle" TargetType="data:DataGridCell"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
     <Setter Property="IsTabStop" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="data:DataGridCell"> 
        <Grid x:Name="Root" Background="{TemplateBinding Background}"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition Width="Auto"/> 
         </Grid.ColumnDefinitions> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CurrentStates"> 
           <VisualState x:Name="Regular"/> 
           <VisualState x:Name="Current"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" 
              Storyboard.TargetName="FocusVisual" 
              Storyboard.TargetProperty="Opacity" To="1"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="ValidationStates"> 
           <VisualState x:Name="Valid"/> 
           <VisualState x:Name="Invalid"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" To="1"/> 
             <ColorAnimation Duration="0" Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="(Fill).Color" To="#FFFFFFFF"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Rectangle x:Name="FocusVisual" 
          Fill="Transparent" 
          Stroke="Transparent" 
          StrokeThickness="0" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          IsHitTestVisible="false" 
          Opacity="0" 
            /> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
         <Rectangle x:Name="InvalidVisualElement" Stroke="#FFDC000C" StrokeThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="False" Opacity="0"/> 
         <Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

和你CellStyle添加到DataGrid

<data:DataGrid x:Name="uiDataGrid" 
      CellStyle="{StaticResource NonSelectableDataGridCellStyle}" 
      > 
    ... 
</data:DataGrid> 
2

您还可以添加 “隐形” 栏:

<sdk:DataGrid.Columns> 
    <sdk:DataGridTextColumn Binding="{Binding Path=Nothing}" MinWidth="0" MaxWidth="0" /> 

,并使其电流无论何时更改当前单元格:

Private Sub _CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentCellChanged 
    If Me.CurrentColumn IsNot Nothing Then Me.CurrentColumn = Me.Columns(0) 
End Sub 

这适合我。

+0

非常狡猾,但它让我感觉有点肮脏。虽然可能比控制模板更棒。 – 2011-10-25 19:44:25