WPF и MVVM, команда нажатия по элементу ListView

196
31 октября 2021, 11:20

Я сделал вот такой простой ListView и забиндил данные в него:

   <ListView Grid.Column="0" DockPanel.Dock="Left" ItemsSource="{Binding BindData}" SelectionMode="Single">
     <ListView.View>
       <GridView>
         <GridView.Columns>
           <GridViewColumn>
             <GridViewColumn.CellTemplate>
                <DataTemplate>
                   <TextBlock Text="{Binding Title}">
                     <TextBlock.InputBindings>
                         <MouseBinding Command="{Binding DataContext.AddTitlesInTable, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}" CommandParameter="{Binding}"  MouseAction="LeftClick" />
                     </TextBlock.InputBindings>
                    </TextBlock>
                   </DataTemplate>                                                   
                 </GridViewColumn.CellTemplate>
                  <GridViewColumn.Header>
                   <TextBlock Text="{x:Static res:Resource.DataHeader}"  />
                  </GridViewColumn.Header>
                </GridViewColumn>
               </GridView.Columns>
              </GridView>
         </ListView.View>
        </ListView>

Я бы хотел, чтобы команда AddTitlesInTable срабатывала по нажатию на всей строке ListView. Но сейчас она работает только если нажать на текст, то есть вложенный элемент TextBlock. Как можно реализовать подобное?

Answer 1

Собственно я использовал взаимодействие команд и событий, отлавливаю событие SelectionChanged и перенаправляю его и выделенный элемент в свою команду:

<ListView Name="ListView1" Grid.Column="1" Grid.Row="2" ItemsSource="{Binding DeteriorationSystemPartsGroupsModelData}" Margin="10,10,10,10">
<i:Interaction.Triggers>
   <i:EventTrigger EventName="SelectionChanged">
      <i:InvokeCommandAction 
          Command="{Binding AddTitlesInTable}"
          CommandParameter="{Binding ElementName=ListView1, Path=SelectedItem}"/>
      </i:EventTrigger>
    </i:Interaction.Triggers>
 <ListView.View>
... etc

Проверено, команда получает выделенную строку, и нажимать можно в любом месте, команда отрабатывает на 100%