2009-12-09 8 views
6

Cuando actualizo una cuadrícula de datos SelectedItem del código (a través de un objeto vinculado en un ViewModel), ¿cómo obtengo la cuadrícula visual para resaltar el elemento recién seleccionado?Silverlight DataGrid Actualización de SelectedItem desde el código

Gracias,
Marcos

ACTUALIZACIÓN: Esto sigue siendo un problema para mí. Mi propiedad SelectedItem ya implementa la notificación de cambio, pero la cuadrícula de datos no es VISUALMENTE mostrando qué fila se ha seleccionado, es decir, no está resaltada.

Respuesta

3

supongo que realmente verificado que la SelectedItem ha cambiado (se puede establecer el modo de Binding a TwoWay temporalmente para ver si funciona al revés, haciendo clic en la fila que debe ver el resaltado y SelectedItem 's set -metodo ejecutado). En caso afirmativo, verifique que realmente coincida exactamente con el Nombre de la propiedad en el método PropertyChanged invoque. Como no eres seguro aquí, es posible que hayas cometido un error ortográfico. En caso negativo, verifique si su Atributo de enlace de datos está configurado correctamente. Otra idea es que puede haber cambiado los estilos o la plantilla de DataGrid y ahora le faltan algunos de los estados visuales . El DataGridRow se puede diseñar con una plantilla de estilo. Tiene tres estados seleccionados, llamados UnfocusedSelected (probablemente el correcto), NormalSelected y MouseOverSelected.

Se podría tratar de hacer su propio Estado visual mediante el uso de esta plantilla:

<Style TargetType="local:DataGridRow"> 
<Setter Property="IsTabStop" Value="False" /> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="local:DataGridRow"> 
      <localprimitives:DataGridFrozenGrid Name="Root"> 
       <vsm:VisualStateManager.VisualStateGroups> 
        <vsm:VisualStateGroup x:Name="CommonStates"> 
         <vsm:VisualState x:Name="Normal"/> 
        <vsm:VisualState x:Name="NormalAlternatingRow"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="0"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="MouseOver"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To=".5"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="NormalSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="MouseOverSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="UnfocusedSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
           <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="(Fill).Color" To="#FFE1E7EC"/> 
          </Storyboard> 
         </vsm:VisualState> 
        </vsm:VisualStateGroup> 
        <vsm:VisualStateGroup x:Name="ValidationStates"> 
         <vsm:VisualState x:Name="Valid"/> 
         <vsm:VisualState x:Name="Invalid"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Visibility"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/> 
           </ObjectAnimationUsingKeyFrames> 
           <DoubleAnimation Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
        </vsm:VisualStateGroup> 
       </vsm:VisualStateManager.VisualStateGroups> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 

       <Grid.Resources> 
        <Storyboard x:Key="DetailsVisibleTransition"> 
         <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> 
        </Storyboard> 
       </Grid.Resources> 

       <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFBADDE9"/> 
       <Rectangle x:Name="InvalidVisualElement" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFF7D8DB"/> 

       <localprimitives:DataGridRowHeader Grid.RowSpan="3" Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
       <localprimitives:DataGridCellsPresenter Grid.Column="1" Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
       <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" Name="DetailsPresenter" /> 
       <Rectangle Grid.Row="2" Grid.Column="1" Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> 
      </localprimitives:DataGridFrozenGrid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

Este es un copiar y pegar de una buena MSDN Article en la personalización de los estilos de DataGrid. Podría, por ejemplo, modificar la parte UnfocusedSelected de la plantilla y ver si observa algún cambio cuando, por ejemplo, agrega un borde rojo alrededor o algo así.

Quizás valga la pena intentarlo. Espero que sepas cómo aplicar tus propios estilos. Si no, aquí hay otro MSDN Resource.

Lo sé, estos son sólo algunos consejos, pero tal vez útiles por fin.

0

que necesita para implementar la interfaz INotifyPropertyChanged en su modelo de vista y tener la propiedad SelectedItem invocar el evento PropertyChanged cuando su valor es cambios.

+0

Tengo INotifyPropertyChanged y estoy estableciendo el valor de una propiedad que ya invoca el evento PropertyChanged. –

Cuestiones relacionadas