gpt4 book ai didi

c# - 以编程方式调整 DataGrid 列的大小 OnLoaded

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:35 25 4
gpt4 key购买 nike

我有这个 DataGrid,当我第一次加载数据时它看起来像这样: enter image description here

所以,它几乎是完美的,但当我将窗口调整到最大时,显示的是我真正想要的——列现在的布局如下: enter image description here

我想在 DataGrid View 的右侧布局最右侧的列,并让左侧的列分配 View 的其余部分。

我的问题是:我能否在 DataGrid 上调用一个事件来实现这种列布局,否则只有在窗口最大化时才会发生这种情况?

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 应该足以找到基于给定布局的解决方案。

最佳答案

我已尝试重现您的案例并得出结果:这取决于您如何使用 ItemsSource。如果 ViewModel 中的 ItemsSource 是一个列表,那么您只需为其分配一个新实例,然后调用 PropertyChanged 事件。这将使列按照您想要的方式运行 (Width="Auto")。

      ItemsSource = new List<Data>();
// ItemsSource.Add(new Data()); // ..adding data
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ItemsSource)));

但是,由于它目前不工作,我猜你可能有一个 ObservableCollection 作为 ItemsSource,并且你正在那里添加项目。在我的测试中,它的行为与您描述的一样,列保持很小,除非手动调整窗口大小或手动调整列。

  public ObservableCollection<Data> ItemsSource { get; set; }
public void AddItems()
{
ItemsSource.Add(new Data()); // not working
}

我发现强制网格执行此操作的唯一方法是将列宽从自动取消设置为某个值,然后返回。使用按钮来执行此操作。但是 Any 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;
}
}
}

关于c# - 以编程方式调整 DataGrid 列的大小 OnLoaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com