2010-06-15 16 views
33

Quiero crear un control DataGrid en WPF en el que hay un botón en la primera celda de cada fila. Al hacer clic en este botón, se mostrará RowDetailsTemplate o SubRow. Mi preocupación es ¿Cómo agrego un botón que mostrará/Ocultar el RowDetailsTemplate?Agregar un botón a WGD DataGrid

Cualquier ayuda será apreciada grandemente

Gracias

Respuesta

47

En primer lugar crear un DataGridTemplateColumn para contener el botón:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Button Click="ShowHideDetails">Details</Button> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Cuando se hace clic en el botón, la actualización el que contiene DataGridRow 's DetailsVisibility:

void ShowHideDetails(object sender, RoutedEventArgs e) 
{ 
    for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) 
    if (vis is DataGridRow) 
    { 
     var row = (DataGridRow)vis; 
     row.DetailsVisibility = 
     row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; 
     break; 
    } 
} 
+1

Este usando de un para-loop es sólo ** ** yolo. – C4u

21

mira esto:

XAML:

<DataGrid Name="DataGrid1"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Click="ChangeText">Show/Hide</Button> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Método:

private void ChangeText(object sender, RoutedEventArgs e) 
{ 
    DemoModel model = (sender as Button).DataContext as DemoModel; 
    model.DynamicText = (new Random().Next(0, 100).ToString()); 
} 

Clase:

class DemoModel : INotifyPropertyChanged 
{ 
    protected String _text; 
    public String Text 
    { 
     get { return _text; } 
     set { _text = value; RaisePropertyChanged("Text"); } 
    } 

    protected String _dynamicText; 
    public String DynamicText 
    { 
     get { return _dynamicText; } 
     set { _dynamicText = value; RaisePropertyChanged("DynamicText"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaisePropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler temp = PropertyChanged; 
     if (temp != null) 
     { 
      temp(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

código de inicialización:

ObservableCollection<DemoModel> models = new ObservableCollection<DemoModel>(); 
models.Add(new DemoModel() { Text = "Some Text #1." }); 
models.Add(new DemoModel() { Text = "Some Text #2." }); 
models.Add(new DemoModel() { Text = "Some Text #3." }); 
models.Add(new DemoModel() { Text = "Some Text #4." }); 
models.Add(new DemoModel() { Text = "Some Text #5." }); 
DataGrid1.ItemsSource = models; 
Cuestiones relacionadas