首页 > 解决方案 > 如何更改所选行中列的可见性?

问题描述

当用户选择一行时,我想在所选行的末尾显示一个按钮。你知道怎么做吗?

我试过这样:

<DataGrid Name="Grid" ItemsSource="{Binding Data}" AutoGenerateColumns="False">
   <DataGrid.ItemContainerStyle>
      <Style TargetType="DataGridRow">
         <EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
      </Style>
   </DataGrid.ItemContainerStyle>
   <!-- ... -->
   <Button Grid.Column="4" Name="ButtonAssign" Visibility= "Hidden" Content="Assign" Click="btnAssign_Click"/>
   <!-- ... -->
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
   var row = (DataGridRow)sender;

   //I don't know how to find the button on the row in here. This doesn't work:
   var buttonAssign = row.FindName("ButtonAssign");
   //buttonAssign is always NULL :-(
   if (buttonAssign != null)
   {
      ((Button)buttonAssign).Visibility = Visibility.Visible;
   }

   ((RowItemModel)row.Item).ButtonAssignVisibility = Visibility.Hidden;
}

你能帮我吗?

标签: c#wpfxamldatagrid

解决方案


您可以使用绑定和实例Visibility将按钮的IsSelected属性绑定到父级的属性built-it ,例如:DataGridRowRelativeSourceBooleanToVisibilityConverter

Visibility="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Converter={StaticResource BooleanToVisibilityConverter}}"

以下代码提供了一个简单示例,其中包含您的问题和评论中的代码。除了Visibility绑定之外,您还必须在范围内的任何资源字典中创建一个转换器实例。

<DataGrid ...>
   <DataGrid.Resources>
      <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
   </DataGrid.Resources>
   <DataGrid.Columns>
      <-- ...your other columns. -->
      <DataGridTemplateColumn IsReadOnly="True">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <Grid>
                  <-- ...row and column definitions, other controls. -->
                  <TextBlock Grid.Column="3"
                             Text="{Binding Note}"/>
                  <Button Grid.Column="4"
                          Name="ButtonAssign"
                          Visibility="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Converter={StaticResource BooleanToVisibilityConverter}}"
                          Content="Assign"
                          Click="btnAssign_Click"/>
               </Grid>
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

推荐阅读