WPF DataTrigger显示和隐藏网格列XAML

时间:2013-12-09 16:11:34

标签: c# wpf xaml datagrid

我有一个包含网格的WPF应用程序。网格分为3列,第3个网格在加载时宽度为零。

我在另外两列中有两个数据网格。当其中一个数据网格中的所选项目发生更改时,其他数据网格会更改其显示值,即主详细信息模板。一切正常。

数据网格中有一个值,如果选中,我希望第3列将其宽度从零更改为2 *。我不知道该怎么做?

我希望通过XAML实现这一目标。我一直在关注数据触发器&价值转换器。我在下面快速编写了一些代码进行测试。我已经读过将列设置为width = 0,依赖项属性设置优先级列表中可能更高。无论如何要做到这一点还是我需要使用代码?

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="0"/>
    </Grid.ColumnDefinitions>

    <DataGrid Grid.Column="0"
              ItemsSource="{Binding OrderList}"
              SelectedItem="{Binding OrderSelected}"                  
              AutoGenerateColumns="True">                                    
    </DataGrid>

    <TextBox Grid.Column="1" Text="{Binding OrderSelected.Name}">
    </TextBox>

    <Grid x:Name="columnHideSeek" Grid.Column="2" Background="Blue">
        <Grid.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding OrderSelected.Name}" Value="Mark">
                        <Setter Property="Grid.Width" Value="10"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
    </Grid>

</Grid>

1 个答案:

答案 0 :(得分:22)

使用正确的DataTrigger,这是完全可能的。首先,将Trigger添加到您要更改的UI元素... ColumnDefinition,而不是Grid

<ColumnDefinition>
    <ColumnDefinition.Style>
        <Style TargetType="{x:Type ColumnDefinition}">
            <Setter Property="Width" Value="10" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding OrderSelected.Name}" Value="Mark">
                    <Setter Property="Width" Value="2*" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ColumnDefinition.Style>
</ColumnDefinition>

接下来,请勿在{{1​​}}元素上设置Width,而应在ColumnDefinition中设置Style。否则,Width元素上的ColumnDefinition将覆盖DataTrigger设置的值。