Как изменить видимость столбца в выбранной строке?

#c# #wpf #xaml #datagrid

#c# #wpf #xaml #datagrid

Вопрос:

Когда пользователь выбирает строку, я хотел бы отобразить кнопку в конце выбранной строки. У вас есть идея, как это сделать?

Я попробовал это так:

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

Не могли бы вы мне помочь, пожалуйста?

Комментарии:

1. Вы должны добавить кнопку в xaml и привязать ее видимость к Row.IsSelected с помощью некоторого преобразователя логического значения в видимость.

2. Название вашего вопроса вводит в заблуждение. Вы спрашиваете о скрытии столбца, но в вашем описании говорится, что вы хотите показать или скрыть кнопку в строке. Пожалуйста, уточните, чего вы хотите добиться. Что означает «отображать кнопку в конце выбранной строки»? Кнопка отображается в отдельном столбце. Как определяется этот столбец?

3. Я хочу отобразить кнопку в отдельном столбце. Столбец определяется как: <Сетка> … Column =»3″ Text=»{Примечание к привязке}» /> Column=»4″ Name=»ButtonAssign» Visibility= «Hidden» Content=»Назначить» Click=»btnAssign_Click»/> </Grid>

Ответ №1:

Вы можете привязать Visibility кнопку к IsSelected свойству родительского DataGridRow элемента, используя RelativeSource привязку и встроенный экземпляр BooleanToVisibilityConverter , например:

 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>