我有这个DataGrid,当我第一次加载数据时它看起来像这样:
因此,它几乎是完美的,但是当我将Window调整为最大尺寸时,我真正想要的是显示-现在列的布局如下:
我想在DataGrid视图的右侧布置最右边的列,并让左列分配视图的其余部分。
我的问题是:我可以在DataGrid上调用一个事件以引起列的这种布局,否则只有在Window最大化时才会发生这种布局吗?
DataGrid的XAML的简化版本如下所示:
<DataGrid
ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
AutoGenerateColumns="False"
GridLinesVisibility="None"
ColumnWidth="*">
<DataGrid.Columns>
<DataGridTemplateColumn Width="*" Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1"
Text="{Binding ItemName}"
ToolTipService.ShowOnDisabled="true"
>
</TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="Auto" Header="Size">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding ItemLengthA}"
HorizontalAlignment="Right"
Margin="3,0,0,0"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="Auto" Header="Modified">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding ItemLastUpdateA}"
HorizontalAlignment="Right"
Margin="3,0,0,0"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我还可以使用应用程序/控件来检查here,但我认为查看上述XAML应该足以找到基于给定布局的解决方案。
答案 0 :(得分:1)
我试图重现您的情况并得出结果:这取决于您如何处理ItemsSource。 如果ViewModel中的ItemsSource是一个List,则只需为其分配一个新实例,然后调用PropertyChanged事件。这将导致列的行为像您想要的那样(Width =“ Auto”)。
ItemsSource = new List<Data>();
// ItemsSource.Add(new Data()); // ..adding data
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ItemsSource)));
但是,由于它当前不起作用,我想您可能有一个ObservableCollection作为ItemsSource,并且您正在其中添加Items。在我的测试中,除非您手动调整Window的大小或手动调整列的大小,否则列会保持较小的行为。
public ObservableCollection<Data> ItemsSource { get; set; }
public void AddItems()
{
ItemsSource.Add(new Data()); // not working
}
我发现迫使网格执行此操作的唯一方法是,将“列宽”从“自动”取消设置为某个值,然后返回。用于执行此操作的按钮。但任何Onload也可以工作
private void Button_Click(object sender, RoutedEventArgs e)
{
foreach (DataGridTemplateColumn item in MyDataGrid.Columns)
{
if (item.Width.IsAuto)
{
item.Width = new DataGridLength(item.ActualWidth, item.Width.UnitType);
item.Width = DataGridLength.Auto;
}
}
}