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