2009-12-09 8 views
6

Lorsque je mets à jour un élément DataGrid SelectedItem à partir d'un code (via un objet lié dans un ViewModel), comment obtenir la grille visuelle pour mettre en évidence l'élément nouvellement sélectionné?Silverlight DataGrid Mise à jour de SelectedItem à partir du code

Merci,
Mark

MISE À JOUR: Ceci est encore un problème pour moi. Ma propriété SelectedItem implémente déjà la notification de modification, mais la grille de données n'est pas VISUELLEMENT affichant quelle ligne a été sélectionnée, c'est-à-dire qu'elle n'est pas mise en surbrillance.

Répondre

3

Je suppose que vous vraiment vérifié que le SelectedItem a changé (vous pouvez définir le mode Binding à TwoWay temporairement pour voir si cela fonctionne dans l'autre sens, en cliquant sur la ligne que vous devriez voir le s de mettre en évidence et SelectedItem » set -method exécuté). Si oui, vérifiez que correspond exactement au nom de propriété sur l'appel de la méthode PropertyChanged. Puisque vous n'êtes pas en sécurité ici, vous avez peut-être fait une faute d'orthographe. Si non, vérifiez si votre attribut de liaison de données est correctement défini. Une autre idée est que vous pourriez avoir changé les styles ou modèles de DataGrid et maintenant il vous manque quelques-uns des Visual States. Le DataGridRow peut être stylé en utilisant un modèle de style. Vous avez trois états sélectionnés, appelés UnfocusedSelected (probablement le bon), NormalSelected et MouseOverSelected.

Vous pouvez essayer de faire votre propre état visuel en utilisant ce modèle:

<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> 

C'est un copier-coller à partir d'une bonne MSDN Article sur la personnalisation des styles DataGrid. Vous pouvez, par exemple, modifier la partie UnfocusedSelected du modèle et voir si vous voyez un changement lorsque, par exemple, vous ajoutez une bordure rouge autour de lui ou quelque chose.

Peut-être que ça vaut le coup d'essayer. J'espère que vous savez comment appliquer vos propres styles. Sinon, voici un autre MSDN Resource. Je sais, ce ne sont que des conseils, mais peut-être utile à la fin.

0

Vous devez implémenter l'interface INotifyPropertyChanged sur votre ViewModel et faire en sorte que sa propriété SelectedItem appelle l'événement PropertyChanged lorsque sa valeur est modifiée.

+0

J'ai INotifyPropertyChanged et je règle la valeur d'une propriété qui appelle déjà l'événement PropertyChanged. –