Silverlight DataGrid Aggiornamento SelectedItem dal codice
-
18-09-2019 - |
Domanda
Quando aggiorno un SelectedItem datagrid dal codice (tramite un oggetto associato in un ViewModel), come ho la griglia visiva per evidenziare l'elemento appena selezionata?
Grazie,
Mark
UPDATE: Questo è ancora un problema per me. La mia proprietà SelectedItem implementa già notifica di modifica, ma il datagrid non è VISIVAMENTE che visualizza quale riga è stata selezionata -. Vale a dire che non è sempre evidenziato
Soluzione
Credo che davvero ha verificato che il SelectedItem
è cambiato (è possibile impostare la modalità Binding
per TwoWay
temporaneamente per vedere se funziona il contrario, facendo clic sulla riga si dovrebbe vedere il punto culminante e SelectedItem
-il metodo di set
eseguito). Se sì, verificare che davvero corrispondere esattamente al nome proprietà sul metodo PropertyChanged
invoke. Dal momento che non stai Typesafe qui, si potrebbe aver fatto un errore di ortografia. Se no, controllare se il vostro attributo Databinding sia impostato correttamente. Un'altra idea è che si potrebbe avere cambiato stili o template del DataGrid
e ora si mancano alcune delle stati visivi . Il DataGridRow
può essere designato utilizzando un modello di stile. Hai tre stati selezionati, chiamato UnfocusedSelected
(probabilmente quella giusta), e NormalSelected
MouseOverSelected
.
Si potrebbe provare a fare il vostro proprio stato visivo utilizzando questo modello:
<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>
Questo è un copia-incolla da un buon articolo MSDN sulla personalizzazione Stili DataGrid. Si potrebbe, ad esempio, modificare la parte UnfocusedSelected
del modello e vedere se si vede alcun cambiamento quando, ad esempio, l'aggiunta di un bordo rosso intorno ad esso o qualcosa del genere.
Forse vale la pena di provare. Spero che si sa come applicare propri stili. Se no, ecco un altro MSDN Resource .
Lo so, questi sono solo suggerimenti, ma forse utile alla fine.
Altri suggerimenti
È necessario implementare l'interfaccia INotifyPropertyChanged
sul ViewModel ed avere la sua proprietà SelectedItem
richiamare l'evento PropertyChanged
quando il suo valore è modifiche.