2009-08-07 14 views
5

Korzystam z datagridu silverlight 3, a wewnątrz niego zagnieżdżam powiązane rekordy w innej kontrolce za pomocą rowdetails (visibilitymode = visiblewhenselected).Zagnieżdżone Silverlight Datagrid - szczegóły wiersza działa świetnie, ale chcę przycisk!

Naprawdę podoba mi się to, jak to działa, ale wolałbym, aby siatka wyświetlała szczegóły wiersza po naciśnięciu przycisku "+", podobnie jak drzewo rozwinie się po kliknięciu węzła.

próbowałem programowo definiowania szablonu za pomocą środków tak:

<Grid.Resources> 
    <DataTemplate x:Key="EmptyTemplate"> 
     <StackPanel> 
      <!--<TextBlock Text="Empty Template!!!" />--> 
     </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="SongTemplate"> 
     <StackPanel> 
      <AdminControls:ArtistSongControl x:Name="ArtistSongControl" /> 
     </Stack> 
    </DataTemplate> 
</Grid.Resources> 

I LoadingRowDetails przypadku, gdy siatka jest, bym wybrać szablon do ustawiania przez:

e.Row.DetailsTemplate = (DataTemplate)LayoutRoot.Resources["SongTemplate"]; 

Ten sortof obrobione , ale odkryłem, że miałem problemy ze zwinięciem poprzedniego szablonu szczegółów wierszy, a nawet rozbiłem ie8 (nie jestem pewien, czy jest to powiązane).

Zasadniczo bardzo podoba mi się, jak działa datagrid silverlight 3, a nawet w jaki sposób implementowane są rzeczy z wiersza poleceń. Po prostu chciałbym odłożyć ładowanie dowolnych szczegółów, dopóki rząd nie zostanie celowo rozszerzony (tak jak byłoby to drzewo). Wydaje się, że wszystkie sieci firm trzecich tak robią, a microsoft jest bardzo blisko. Czy ktoś ma jakiś pomysł, jak rozwiązać ten problem?

Dzięki Dennis

Odpowiedz

6

Dennis,

W przypadku, gdy nie są już znaleźć odpowiedź na to, chciałem ten sam problem i rozwiązać go, dostosowując RowHeaderTemplate, który pozwala rzucić przycisku w nagłówek dla każdego wiersza. Potem wdrożył obsługi dla przycisku tak:

private void ToggleButton_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    ToggleButton button = sender as ToggleButton; 
    DataGridRow row = button.GetVisualAncestorOfType<DataGridRow>(); 

    if (button.IsChecked == true) 
    { 
     row.DetailsVisibility = Visibility.Visible; 

     //Hide any already expanded row. We only want one expanded at a time for simplicity and 
     //because it masks a virtualization bug in the datagrid. 
     if (_expandedRow != null) 
      _expandedRow.DetailsVisibility = Visibility.Collapsed; 

     _expandedRow = row; 
    } 
    else 
    { 
     row.DetailsVisibility = Visibility.Collapsed; 
     _expandedRow = null; 
    } 
} 

pamiętać, że GetVisualAncestorOfType <> jest metoda rozszerzenie I zostały wdrożone kopać w drzewa wizualnej.

Trzeba także ustawić DataGrid rekreacyjnego HeadersVisibility do wiersza lub All

+0

prostu zastanawiasz się, w jaki sposób chodzi o odznaczenie ToggleButton w wierszu, który jest zaznaczony po kliknięciu przycisku nowego wiersza? –

0

Proponuję spojrzeć na razie RowVisibilityChanged na DataGrid, w zasadzie wtedy, gdy zmiany widoczności rząd do „widoczny”, a następnie obciążenie informacje o rzędzie.

1

tu jest inny sposób, aby osiągnąć to, co staramy się robić:

W DataGrid utworzenia LoadingRow wydarzenie tak:

<data:DataGrid LoadingRow="ItemsGrid_LoadingRow" ..... 

W DataGrid utworzyć kolumnę szablon, który będzie zawierał Przyciski takie jak:

<data:DataGridTemplateColumn CellStyle="{StaticResource DataGridCellStyle1}" CanUserReorder="False"> 
     <data:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
        <Button x:Name="ViewButton" Click="ToggleRowDetailsVisibility" Cursor="Hand" Content="View Details" />          
      </DataTemplate> 
     </data:DataGridTemplateColumn.CellTemplate> 
     </data:DataGridTemplateColumn> 

w LoadingRow Event zlokalizowania przycisk, który jest (w tym przypadku) przechowywane w pierwszej kolumnie siatki danych, a następnie przechowywać CUR wynajem DataGridRow do elementu przyciski tagów

private void ItemsGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var ViewButton = (Button)ItemsGrid.Columns[0].GetCellContent(e.Row).FindName("ViewButton"); 
     ViewButton.Tag = e.Row; 
    } 

w przyciskach Podprogram (w tym przypadku ToggleRowDetailsVisibility) będziemy wydobywać rzędzie tak, że możemy przełączyć jego DetailsVisibility

In the LoadingRow Event locate the button that is (in this case) stored in the first column of the DataGrid, then store the current DataGridRow into the buttons Tag element 

private void ToggleRowDetailsVisibility(object sender, RoutedEventArgs e) 
    { 
     var Button = sender as Button; 
     var Row = Button.Tag as DataGridRow; 

     if(Row != null) 
     { 
      if(Row.DetailsVisibility == Visibility.Collapsed) 
      { 
       Row.DetailsVisibility = Visibility.Visible; 

       //Hide any already expanded row. We only want one expanded at a time for simplicity and 
       //because it masks a virtualization bug in the datagrid. 
       if (CurrentlyExpandedRow != null) 
       { 
        CurrentlyExpandedRow.DetailsVisibility = Visibility.Collapsed; 
       } 

       CurrentlyExpandedRow = Row; 
      } 
      else 
      { 
       Row.DetailsVisibility = Visibility.Collapsed; 
       CurrentlyExpandedRow = null; 
      } 
     } 
    } 

można zauważyć, że „CurrentlyExpandedRow” , jest to zmienna globalna typu DataGridRow, w której przechowujemy obecnie rozwinięty wiersz, co pozwala nam zamknąć ten wiersz, gdy nowy ma zostać otwarty.

Mam nadzieję, że to pomoże.

1

Oprócz uxrx odpowiedzi dostarczonych tutaj jest kod dla znalezienia przodka

public static partial class Extensions 
{ 
    public static T FindAncestor<T>(DependencyObject obj) where T : DependencyObject 
    { 
     while (obj != null) 
     { 
      T o = obj as T; 
      if (o != null)    
       return o; 

      obj = VisualTreeHelper.GetParent(obj); 
     } 
     return null; 
    } 

    public static T FindAncestor<T>(this UIElement obj) where T : UIElement 
    { 
     return FindAncestor<T>((DependencyObject)obj); 
    } 
} 
1

W tym:

DataGridRow row = button.GetVisualAncestorOfType<DataGridRow>(); 

Możemy użyć jako:

HyperlinkButton button = sender as HyperlinkButton;  
DataGridRow Row = DataGridRow.GetRowContainingElement(button) 
Powiązane problemy