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

时间:2012-04-30 16:32:37

标签: c# wpf xaml

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

我的标记基本上是

<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"/>
...

使用星形大小调整的两个单独网格(这意味着我无法使用SharedSizeGroups。 现在我必须添加一个配置选项来隐藏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'使用(密封)之后,它无法修改。”

1 个答案:

答案 0 :(得分:1)

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

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