babsevensix

Il blog di Alberto
posts - 94, comments - 81, trackbacks - 11

Silverlight : una Datagrid all’interno di una riga di una Datagrid

Oggi vi propongo un effetto che ho utilizzato recentemente in silverlight. Nel caso specifico, in una datagrid contente la classifica globale dei giocatori di un torneo, volevo visualizzare le partite di ogni singolo giocatore.

Datagrid_in_datagrid

Ho deciso quindi di inserire una datagrid all’interno di un’altra datagrid, come in figura.

Per realizzare l’effetto ho quindi utilizzato l’evento RowDetailsVisibilityChanged.

 

<data:DataGrid  IsReadOnly="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RowBackground="{Binding Converter={StaticResource mc}}" x:Name="dtgClassifica" RowDetailsVisibilityChanged="dtgClassifica_RowDetailsVisibilityChanged" AutoGenerateColumns="False" MouseLeave="dtgClassifica_MouseLeave" Background="{Binding Converter={StaticResource mc}}" Grid.Row="2" RowDetailsTemplate="{StaticResource RowDetailGiocatore}" Margin="8,0">

      <data:DataGrid.Columns>

<data:DataGridTextColumn Header="Giocatore" Binding="{Binding Giocatore}" />

<data:DataGridTextColumn Header="Punti" Binding="{Binding Punti}" />

            <data:DataGridTextColumn Header="Posizione" Binding="{Binding Posizione}" />

      </data:DataGrid.Columns>

</data:DataGrid>

All’interno del metodo invoco il mio servizio wcf in modo asincrono passando allo user state l’oggetto e.DetailsElement , ovvero l’elemento di dettaglio.

Il codice quindi è:

Private Sub dtgClassifica_RowDetailsVisibilityChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowDetailsEventArgs)

Dim cg As ServiceLaSfida.ClassificaGiocatore = DirectCast(e.Row.DataContext, ServiceLaSfida.ClassificaGiocatore)

If e.DetailsElement.DataContext Is Nothing OrElse e.DetailsElement.DataContext.GetType IsNot GetType(ServiceLaSfida.InformazioniUtente) Then

Dim sc As New ServiceLaSfida.ServiceClient

AddHandler sc.InformazioniUtenteCompleted, AddressOf GettedInfoUtente

 

sc.InformazioniUtenteAsync(cg.Giocatore, Me.TipoFlotta, e.DetailsElement) ' cg)

Else

End If

End Sub

A questo punto la soluzione è semplice :

Public Sub GettedInfoUtente(ByVal sender As Object, ByVal e As ServiceLaSfida.InformazioniUtenteCompletedEventArgs)

      If e.Result IsNot Nothing Then

            DirectCast(e.UserState, FrameworkElement).DataContext = e.Result

      End If

End Sub

Concludo il codice, per completezza, con il template del dettaglio della riga:

<DataTemplate x:Key="RowDetailGiocatore">

      <Border Height="Auto" HorizontalAlignment="Stretch" Width="Auto" CornerRadius="10" Padding="5">

            <Border.Background>

                  <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                        <GradientStop Color="#FF39A1C7" Offset="0"/>

                        <GradientStop Color="White" Offset="1"/>

                  </LinearGradientBrush>

            </Border.Background>

            <StackPanel HorizontalAlignment="Stretch" Orientation="Vertical" Height="164" Width="181">

                  <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">

                        <TextBlock Text="Nome : "/>

                        <TextBlock Text="{Binding NomeGiocatore}" TextWrapping="Wrap"/>

                  </StackPanel>

                  <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">

                        <TextBlock Text="Assenze :"/>

                        <TextBlock Text="{Binding NumAssenze}" TextWrapping="Wrap"/>

                        <TextBlock Text=" Disconnessioni :"/>

                        <TextBlock Text="{Binding NumDisconnessioni}" TextWrapping="Wrap"/>

                  </StackPanel>

                  <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">

                        <TextBlock Text="Num. Flotte :"/>

                        <TextBlock Text="{Binding NumPartiteFlotta}" TextWrapping="Wrap"/>

                        <TextBlock Text=" Num. Match race :"/>

                        <TextBlock Text="{Binding NumPartiteMatchRace}" TextWrapping="Wrap"/>

                  </StackPanel>

                  <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">

                        <TextBlock Text="Num. volte a podio : "/>

                        <TextBlock Text="{Binding NumVolteAPodio}" TextWrapping="Wrap"/>

                  </StackPanel>

                  <data:DataGrid Height="100" ItemsSource="{Binding GarePartecipate}" x:Name="dtgRegateGiocatore"

                        AutoGenerateColumns="False" IsReadOnly="True" SelectionChanged="dtgRegateGiocatore_SelectionChanged">

                        <data:DataGrid.Columns>

                             <data:DataGridTextColumn Header="Posizione" Binding="{Binding Posizione}" />

                             <data:DataGridTextColumn Header="Punti" Binding="{Binding Punti}" />

                        </data:DataGrid.Columns>

                  </data:DataGrid>

            </StackPanel>

      </Border>

</DataTemplate>

Print | posted on domenica 11 ottobre 2009 01:03 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET