2012-02-28 14 views
10

.Net 4 WPF DataGrid C# MMVMDataGrid SelectionUnit = ¿La celda deshabilita todo el soporte para una fila seleccionada?

Cuando la cuadrícula de datos es SelectionUnit fila completa, WPF enlace de datos y la vistacoleccion cuidar de que me deja saber en el modelo de vista lo que es el elemento seleccionado de forma activa a través de la propiedad CurrentItem de la vista. Esto funciona muy bien para las redes de solo lectura con el modo de selección configurado en su totalidad.

Ahora tengo una grilla editable. Así que configuré SelectionUnit = Cell para que sea más fácil detectar en qué celda se encuentra. Ahora, de repente, la grilla ya no tiene la capacidad de rastrear el elemento de selección. Ni siquiera puedo configurar SelectedItem cuando está configurado en modo celular. Entonces, el modelo de vista siempre piensa que está en la primera fila. Puedo manejar SelectedCellsChanged en la grilla para descubrir en qué fila estoy, simplemente no tengo forma de dejar que el modelo de vista lo sepa ya que el elemento SelectedItem de la cuadrícula ya no se puede configurar.

No entiendo por qué la cuadrícula no puede tener un SelectedItem en el modo de selección de celda.

Si no introduzco la codificación en mi cuadrícula para convertir ItemSource en mi colección para llamar a MoveCurrentTo desde el evento SelectedCellsChanged, ¿hay alguna otra MVVM verdadera para mantener el elemento CurrentItem de la vista sincronizado con la cuadrícula?

O eso, o cambio el estilo de cuadrícula para eliminar o reducir el efecto de resaltado de fila cuando tengo una grilla editable.

+0

si tiene que "codificar", cree una interfaz –

+0

Sí, eso es lo que he hecho por ahora. – happyfirst

+0

Acabo de mirar la fuente 'DataGrid' y en el modo' Cell', no se sincronizan con 'SelectedItem' –

Respuesta

0

yo también Tengo un problema similar, así que aquí está el estilo que utilicé (copiado de la red). Para copiar el tema de WhistlerBlue desde http://datagridthemesfromsl.codeplex.com/ y hacer las siguientes modificaciones. Espero que esto ayude.

<!--Cell--> 
<Style x:Key='CellStyle' TargetType="{x:Type controls:DataGridCell}" > 
    <Setter Property="Foreground" Value="{StaticResource ThemeForegroundBrush}" /> 
    <Setter Property="Height" Value="Auto" /> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Cursor" Value="Arrow" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <!--Padding hack--> 
    <Setter Property="Padding" Value="2 5 2 5" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:DataGridCell}"> 
       <Grid x:Name="Root" Background="Transparent"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <Rectangle x:Name="FocusVisual" Margin="0,-2,0,0" 
           Stroke="White" Fill="White" 
           Opacity="0" IsHitTestVisible="false"/> 
        <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" 
             ContentTemplate="{TemplateBinding ContentTemplate}" Cursor="{TemplateBinding Cursor}"/> 
        <Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

</Style> 

<!-- DataGridRow --> 
<Style x:Key='RowStyle' TargetType="{x:Type controls:DataGridRow}"> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:DataGridRow}"> 
       <Border x:Name="DGR_Border" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="True"> 
        <primitives:SelectiveScrollingGrid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 

         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height='Auto' /> 
         </Grid.RowDefinitions> 
         <Rectangle x:Name="Selected" Margin="0" Grid.RowSpan="2" Grid.ColumnSpan="2" 
           Fill="{StaticResource BtnOverFill}" Stroke="{StaticResource selectedStroke}" 
           Opacity="0"/> 
         <Rectangle x:Name="SelectedHighlight" Margin="1" Grid.RowSpan="2" Grid.ColumnSpan="2" 
           Stroke="#A0FFFFFF" 
           Opacity="0"/> 
         <primitives:DataGridRowHeader Grid.RowSpan="2" 
                primitives:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"          
                Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}, 
          Path=HeadersVisibility, 
          Converter={x:Static controls:DataGrid.HeadersVisibilityConverter}, 
          ConverterParameter={x:Static controls:DataGridHeadersVisibility.Row}}"/> 
         <Rectangle x:Name="Over" Margin="0" Grid.RowSpan="2" Grid.ColumnSpan="2" 
           Fill="{StaticResource hoverGradient}" 
           Stroke="{StaticResource hoverStroke}" 
           Opacity="0"/> 
         <primitives:DataGridCellsPresenter Grid.Column="1" 
             ItemsPanel="{TemplateBinding ItemsPanel}" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
         <primitives:DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" 
                  x:Name='DetailsPresenter' 
                  primitives:SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static controls:DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static controls:SelectiveScrollingOrientation.Vertical}}"                               
                  Visibility="{TemplateBinding DetailsVisibility}"                
                  /> 
         <Rectangle Height="1" HorizontalAlignment="Stretch" 
            x:Name="BottomGridLine" 
            Fill="{StaticResource HorizontalVerticalGridLinesBrush}" 
            Grid.Column="1" Grid.Row="2" /> 
        </primitives:SelectiveScrollingGrid> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property='IsSelected' Value='True'> 
         <Trigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0.84"/> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="1"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0"/> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="0"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.ExitActions> 
         <!--<Setter Property="DetailsVisibility" Value="Visible" />--> 
        </Trigger> 
        <MultiTrigger > 
         <MultiTrigger.Conditions> 
          <Condition Property="IsMouseOver" Value="True" /> 
          <Condition Property="IsSelected" Value="False" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Over" Storyboard.TargetProperty="Opacity" To="0.73"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.EnterActions> 
         <MultiTrigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Over" Storyboard.TargetProperty="Opacity" To="0"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.ExitActions> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="True" /> 
          <Condition Property="IsFocused" Value="False" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0.84"/> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="1"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.EnterActions> 
         <MultiTrigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0"/> 
            <DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="0"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.ExitActions> 
        </MultiTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
5

que estaba buscando los mismos problemas y encontré una solución simple

Para acceder a la fila con SelectionUnit conjunto de Cell que tiene que hacer:

DataGridXX.SelectedCells[0].item 

Funciona sólo si puede seleccionar solo una celda a la vez (no en modo Extendido).

Cuestiones relacionadas