Search code examples
c#wpfxamldatagrid

How change visibility of column in selected row?


When the user selects a row, I would like to display a button at the end of the selected row. Do you have an idea how to do it?

I tried it like this:

<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;
}

Can you help me please?


Solution

  • You can bind the Visibility of the button to the IsSelected property of the parent DataGridRow using a RelativeSource binding and an instance the built-it BooleanToVisibilityConverter, e.g.:

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

    The following code provides a simple example incorporating code from your question and comments. Apart from the Visibility binding, you have to create a converter instance in any resource dictionary in scope.

    <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>