有没有办法以编程方式修改这些列定义

本文关键字:定义 修改 方式 编程 有没有 | 更新日期: 2023-09-27 18:32:39

我有一个显示项目列表的页面。

我的标记基本上是

<Grid x:Name="ItemGrid">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="30*" x:Name="Column1Header"/>
    <ColumnDefinition Width="15*" x:Name="Column2Header"/>
    <ColumnDefinition Width="15*" x:Name="Column3Header"/>
...
<ItemsControl Name="ItemsList">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Grid x:Name="Items">
        <ColumnDefinition Width="30*" x:Name="Column1"/>
        <ColumnDefinition Width="15*" x:Name="Column2"/>
        <ColumnDefinition Width="15*" x:Name="Column3"/>
...

两个使用星形大小的单独网格(这意味着我不能使用共享大小组。现在我必须添加一个配置选项来隐藏Column3和标题。我可以通过在代码中将宽度设置为 0 来轻松隐藏标题,但是我不知道如何隐藏Column3.循环遍历项始终会导致 null。

foreach (var item in ItemsList.Items)
{
  var container = ItemsList.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;
  // container is null
}

基本上两列的大小需要相同。如果重要,网格每 30 秒填充一次新的项目列表,但网格大小在加载后不会更改。

我还尝试让两列共享定义宽度的 Style,然后尝试通过代码更改样式,但这也没有成功。

<Style TargetType="{x:Type ColumnDefinition}" x:Key="Column3Width">
   <Setter Property="Width" Value="15*"/>
</Style>

修改它会导致错误:"'SetterBase'在使用(密封)后,无法修改。

有没有办法以编程方式修改这些列定义

您可以将项目列的宽度绑定到标题列:

Width="{Binding Width, ElementName=ColumnXHeader}"