Here is some xaml to produce this behavior.
<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource SampleDataSource}}"> <ScrollViewer x:Name="scv" HorizontalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" > <sdk:DataGrid x:Name="dgItems" HorizontalAlignment="Stretch" AutoGenerateColumns="False" ItemsSource="{Binding Collection}"> <sdk:DataGrid.RowDetailsTemplate> <DataTemplate> <Grid HorizontalAlignment="Stretch" Margin="2" MinHeight="40"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock HorizontalAlignment="Left" Grid.Row="0" Text="Bio" Margin="4"/> <TextBlock HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1" Margin="4" Text="{Binding Bio}" TextWrapping="Wrap" /> </Grid> </DataTemplate> </sdk:DataGrid.RowDetailsTemplate> <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> <sdk:DataGridTextColumn Binding="{Binding Name}" Header="Name" /> <!-- <sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> --> </sdk:DataGrid.Columns> </sdk:DataGrid> </ScrollViewer> </Grid>
If I add a dummy template column, and the Datagrid width behavior, it now looks like:
And here is the xaml with the extra column and the Datagrid Column Width Trigger.
<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource SampleDataSource}}"> <ScrollViewer x:Name="scv" HorizontalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" > <sdk:DataGrid x:Name="dgItems" HorizontalAlignment="Stretch" AutoGenerateColumns="False" ItemsSource="{Binding Collection}"> <sdk:DataGrid.RowDetailsTemplate> <DataTemplate> <Grid Margin="2" MinHeight="40" Width="Auto" HorizontalAlignment="Stretch"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock HorizontalAlignment="Left" Grid.Row="0" Text="Bio" Margin="4"/> <TextBlock HorizontalAlignment="Stretch" Width="Auto" Grid.Row="0" Grid.Column="1" Margin="4" Text="{Binding Bio}" TextWrapping="Wrap" /> </Grid> </DataTemplate> </sdk:DataGrid.RowDetailsTemplate> <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> <sdk:DataGridTextColumn Binding="{Binding Name}" Header="Name" /> <sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> </sdk:DataGrid.Columns> <i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <this:DataGridSpreadColumnsAction/> </i:EventTrigger> <i:EventTrigger EventName="SizeChanged"> <this:DataGridSpreadColumnsAction/> </i:EventTrigger> </i:Interaction.Triggers> </sdk:DataGrid> </ScrollViewer> </Grid>
The code for the DataGridSpreadColumnsAction is.
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Interactivity; public class DataGridSpreadColumnsAction : TriggerAction<DataGrid> { public static DependencyProperty ColumnSpreadProperty = DependencyProperty.Register("ColumnSpread", typeof(DataGridColumnSpread), typeof(DataGridSpreadColumnsAction), new PropertyMetadata(DataGridColumnSpread.LastColumn)); // Space available to fill ( -18 Standard vScrollbar) private const int ScrollbarWidth = 18; public enum DataGridColumnSpread { LastColumn, Evenly } public DataGridColumnSpread ColumnSpread { get { return (DataGridColumnSpread)GetValue(DataGridSpreadColumnsAction.ColumnSpreadProperty); } set { SetValue(DataGridSpreadColumnsAction.ColumnSpreadProperty, value); } } protected override void Invoke(object parameter) { DataGrid associatedDataGrid = this.AssociatedObject as DataGrid; if (associatedDataGrid != null && associatedDataGrid.RenderSize.Width != 0 && associatedDataGrid.Columns.Count > 0) { switch (this.ColumnSpread) { case DataGridColumnSpread.LastColumn: DistributeToLastColumn(associatedDataGrid); break; case DataGridColumnSpread.Evenly: DistributeEvenly(associatedDataGrid); break; default: DistributeToLastColumn(associatedDataGrid); break; } } } private static void DistributeToLastColumn(DataGrid dataGrid) { double sumOfColumnWidths = SumColumnWidths(dataGrid); double space_available = (dataGrid.RenderSize.Width - ScrollbarWidth) - sumOfColumnWidths; if (Math.Abs(space_available) > 1) { var column = dataGrid.Columns[dataGrid.Columns.Count - 1]; column.Width = new DataGridLength(column.ActualWidth + space_available); } } private static void DistributeEvenly(DataGrid dataGrid) { double sumOfColumnWidths = SumColumnWidths(dataGrid); double space_available = (dataGrid.RenderSize.Width - ScrollbarWidth) - sumOfColumnWidths; if (Math.Abs(space_available / dataGrid.Columns.Count) >= 1) { foreach (DataGridColumn column in dataGrid.Columns) { column.Width = new DataGridLength(column.ActualWidth + (space_available / dataGrid.Columns.Count)); } } } private static double SumColumnWidths(DataGrid dataGrid) { double sumColumnWidths = 0.0; foreach (DataGridColumn column in dataGrid.Columns) { sumColumnWidths += column.ActualWidth; } return sumColumnWidths; } }
I hope this helps somone who was having issues with their RowDetailsTemplate being truncated.
-Austin
No comments:
Post a Comment