Sí ... dos formas. Uno simplemente puede añadir un estilo para DataGrid
que establece las columnas como esta ...
<Style x:Key="MyColumnDefsStyle" x:Shared="True" TargetType="DataGrid">
<Setter Property="Columns">
<Setter.Value>
<DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/>
<DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/>
<DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/>
<DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/>
</Setter.Value>
</Setter>
</Style>
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo1}" />
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo2}" />
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo3}" />
que funciona, sino que representa un problema si lo está aplicando a múltiples redes que ellos mismos ya esté utilizando un estilo.
En ese caso, la otra forma, más flexible, funciona mejor. Sin embargo, esto requiere crear clases compatibles con XAML para representar un ObservableCollection<DataGridColumn>
(aunque técnicamente solo dijiste columnas, me gustaría que se completara yo mismo, así que también haría una para las filas). Luego agrégalas a un lugar al que puedas hacer referencia en el XAML espacios de nombres (Que llamo mío xmlns:dge
para 'DataGridEnhancements') A continuación se usa de esta manera:
En el código somwhere (me gustaría hacer accesible en todo el app) ...
public class DataGridRowsCollection : ObservableCollection<DataGridRow>{}
public class DataGridColumnsCollection : ObservableCollection<DataGridColumn>{}
Luego, en los recursos ...
<dge:DataGridColumnsCollection x:Key="MyColumnDefs" x:Shared="True">
<DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/>
<DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/>
<DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/>
<DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/>
</dge:DataGridColumnsCollection>
Y finalmente en el XAML ...
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" />
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" />
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" />
HTH,
Marcos
EDIT: Puesto que no se puede establecer la propiedad DataGrid.Columns
, es necesario mejorar su DataGridView
(como se menciona en los comentarios). Este es el código para un EnhancedDataGrid
:
public class EnhancedDataGrid : DataGrid
{
//the dependency property for 'setting' our columns
public static DependencyProperty SetColumnsProperty = DependencyProperty.Register(
"SetColumns",
typeof (ObservableCollection<DataGridColumn>),
typeof (EnhancedDataGrid),
new FrameworkPropertyMetadata
{
DefaultValue = new ObservableCollection<DataGridColumn>(),
PropertyChangedCallback = EnhancedDataGrid.SetColumnsChanged,
AffectsRender = true,
AffectsMeasure = true,
AffectsParentMeasure = true,
IsAnimationProhibited = true,
DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
});
//callback to reset the columns when our dependency property changes
private static void SetColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var datagrid = (DataGrid) d;
datagrid.Columns.Clear();
foreach (var column in (ObservableCollection<DataGridColumn>)e.NewValue)
{
datagrid.Columns.Add(column);
}
}
//The dependency property wrapper (so that you can consume it inside your xaml)
public ObservableCollection<DataGridColumn> SetColumns
{
get { return (ObservableCollection<DataGridColumn>) this.GetValue(EnhancedDataGrid.SetColumnsProperty); }
set { this.SetValue(EnhancedDataGrid.SetColumnsProperty, value); }
}
}
Ahora se podría establecer las columnas con los SetColumns propiedad de dependencia creado en su CustomControl:
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" />
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" />
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" />
pregunta similar, respuestas útiles: http://stackoverflow.com/questions/5716123/wpf-datagrid-columns-in-style-or-resource – surfen