2009-11-18 19 views
11

Tengo DataGrid en WPF. Y estoy tratando de agregar Button s a ciertas celdas de la grilla, una vez que está vinculado a un particular ItemsSource. He tratado de hacer esto en el XAML como esto:¿Cuál es el código detrás de datagridtemplatecolumn, y cómo usarlo?

<dg:DataGridTemplateColumn x:Name="R1" CanUserReorder="False" IsReadOnly="False">    
    <dg:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <awc:ImageButton Content="Edit" Name="btnEdit" Visibility="Collapsed"/> 
     </DataTemplate> 
    </dg:DataGridTemplateColumn.CellTemplate> 
</dg:DataGridTemplateColumn> 

Sin embargo, quiero saber cómo puedo hacer esto en el código subyacente. Necesito esto para poder ubicar Button s cada vez que se realiza un clic particular. Cualquier ayuda será muy apreciada.

Respuesta

22

uso esto:

DataGridTemplateColumn col1 = new DataGridTemplateColumn(); 
col1.Header = "MyHeader"; 
FrameworkElementFactory factory1 = new FrameworkElementFactory(typeof(CheckBox)); 
Binding b1 = new Binding("IsSelected"); 
b1.Mode = BindingMode.TwoWay; 
factory1.SetValue(CheckBox.IsCheckedProperty, b1); 
factory1.AddHandler(CheckBox.CheckedEvent, new RoutedEventHandler(chkSelect_Checked)); 
DataTemplate cellTemplate1 = new DataTemplate(); 
cellTemplate1.VisualTree = factory1; 
col1.CellTemplate = cellTemplate1; 
dgTransportReqsts.DataGrid.Columns.Add(col1); 

que utiliza esto para añadir CheckBox en mi DataGridTemplateColumn en tiempo de ejecución. Espero que esto ayude !!

+0

Lo siento por golpear un hilo antiguo, pero en el caso de Button en 'FrameworkElementFactory (typeof (Button))', ¿cómo agrego el texto del botón? No he podido hacerlo, ¿o me estoy perdiendo algo? –

+1

@Manish Sinha, use factory1.SetValue (Button.ContentProperty, b1); Puede establecer cualquier propiedad de Button en su caso de la misma manera que estoy configurando la propiedad IsChecked de CheckBox en el ejemplo anterior. – viky

+0

¡Dulce! ¡¡Tan simplemente!! Muchas gracias. –

3

La respuesta de Anurag funcionará muy bien si desea agregar los botones antes de que se cree una instancia de la cuadrícula, específicamente antes de agregar la columna a la cuadrícula.

Si desea agregar el botón a la celda de la cuadrícula después de que la cuadrícula ya está construida, puede hacerlo haciendo cambios en el objeto DataGridCell. En primer lugar hay que encontrarlo:

  1. Encuentra la DataGridCell utilizando DataGridColumn.GetCellContent
  2. Uso VisualTreeHelper a escanear hasta el árbol visual al DataGridCell

Una vez hecho esto, hay varias formas de añadir un botón para DataGridCell, dependiendo de lo que intente lograr:

  • Conjunto DataGridCell.Template t OA ControlTemplate que contiene los botones y otra estilo deseado, -O-
  • Establecer DataGridCell.ContentTemplate a un DataTemplate que contiene los botones y otros artículos que usted desea, -O-
  • Tener DataTemplate de su columna incluye un panel marcador de posición para sostener nuevos botones, busque en el árbol visual de este panel Name y añádalo.

Un enfoque alternativo que no requiere la búsqueda de la célula es:

  1. Incluir una propiedad ObservableCollection<T> en su modelo de vista que suministra la información para crear los botones
  2. En su DataTemplate, disponen de ItemsControl que hacen referencia a esta propiedad y tiene un DataTemplate que puede crear el botón correcto del tipo T
  3. Cuando desee agregar un botón, simplemente agregue un elemento al ObservableCollection propiedad
Cuestiones relacionadas