在选定的数据网格上显示一个按钮

时间:2012-09-06 14:09:39

标签: wpf button datagrid visibility selected

我有一个带有数字行的数据网格。每行都有DeleteRow按钮。只有选中的行才能显示此按钮。我认为可能至少有两种解决方案:

a)将按钮的Visibility属性绑定到包含DatGridRow的IsSelected属性

b)使用按钮中的触发器仅在选择包含行时才可见。

这是我对选项b的代码,它不起作用:

<DataGridTemplateColumn Width="50">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Button Content="X" Tag="{Binding}" Click="DeletRow_Click" Visibility="Hidden">
            <Button.Style>
                <Style x:Name="ButtonVisibility">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}},Path=IsSelected}" Value="True">
                            <Setter Property= "Button.Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

这可能很容易,但我一直盯着它,现在让我眼花缭乱:S

感谢

2 个答案:

答案 0 :(得分:11)

由于Dependency Property Value Precedence,它无效。您无法在Style内更改本地值。将Visibility.Hidden移至Style即可。

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Button Content="X" Tag="{Binding}" Click="DeletRow_Click">
            <Button.Style>
                <Style x:Name="ButtonVisibility">
                    <Setter Property="Button.Visibility" Value="Hidden"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True">
                            <Setter Property="Button.Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

答案 1 :(得分:2)

您可以使用WPF提供的转换器BooleanToVisibiltyConverter来切换按钮的可见性 -

<DataGrid>
            <DataGrid.Resources>
                <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTemplateColumn Width="50">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="X" Tag="{Binding}"
                                    Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter},
                                                    RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>