2010-06-15 4 views
33

Je souhaite créer un contrôle DataGrid dans WPF dans lequel se trouve un bouton dans la première cellule de chaque ligne. Cliquez sur ce bouton pour afficher RowDetailsTemplate ou SubRow. Ma préoccupation est Comment ajouter un bouton qui montrera/cacher le RowDetailsTemplate?Ajout d'un bouton à un contrôle DataGrid WPF

Toute aide sera grandement appréciée

Merci

Répondre

47

d'abord créer un DataGridTemplateColumn pour contenir le bouton:

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

Lorsque le bouton est cliqué, mise à jour le contenant 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

Cette utilisant une boucle for est juste ** yolo **. – C4u

21

Check this out:

XAML:

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

Méthode:

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

Classe:

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)); 
     } 
    } 
} 

code d'initialisation:

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;