Как обновить ListViewItem.SelectedItem всякий раз, когда дочерний элемент управления ListView получает фокус?

Как обновить ListView.SelectedItem когда ребенок контролирует внутри ListView получает фокус?

<ListView ItemsSource="{Binding Path=Records, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True">
     <ListView.SelectedItem>
          <Binding Path="SelectedRecord" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
     </ListView.SelectedItem>
     <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
               <Style.Triggers>
                   <Trigger Property="IsKeyboardFocusWithin" Value="True">
                         <Setter Property="IsSelected" Value="True"/>
                   </Trigger>
               </Style.Triggers>
          </Style>
     </ListView.ItemContainerStyle>
     <ListView.Resources>
          <DataTemplate DataType="x:Type ListViewItem">
               <ListViewItem IsSelected="{Binding IsKeyboardFocusWithin"/>
          </DataTemplate>
     </ListView.Resources>
     <ListView.View>
          <GridView>
              <GridViewColumn>
              <TextBox ... Tag="{Binding}".../>
              </GridViewColumn>
              <GridViewColumn>
              <TextBox ... Tag="{Binding}".../>
              </GridViewColumn>
          </GridView>
     </ListView.View>
</ListView>

ListView имеет ряды дочерних элементов управления в пределах GridView колонны. Я хочу обновить связанное свойство ListView.SelectedItem когда любой дочерний элемент управления в любом ряду имеет фокус клавиатуры. Было бы здорово, если бы это можно было сделать полностью в рамках .xaml файл без необходимости прибегать к коду.

1 ответ

Измените SelectionMode вашего ListBox в Single

Ваш текущий код работает, если вы не установите по умолчанию SelectedItemОднако, если вы установите значение по умолчанию SelectedItem тогда он автоматически не отменяет выбор, когда вы нажимаете на 2-й элемент, поэтому SelectedItem остается привязанным к выбранному по умолчанию элементу, пока вы не зададите фокус строки и не удалите его снова.

Вы также можете немного упростить свой XAML. Вам не нужно DataTemplate в вашем ListBoxItem.Resources и вы можете установить SelectedItem в вашем <ListBox> пометить напрямую

<ListView ItemsSource="{Binding Path=Records}" IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedRecord}" SelectionMode="Single">

     <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
               <Style.Triggers>
                   <Trigger Property="IsKeyboardFocusWithin" Value="True">
                         <Setter Property="IsSelected" Value="True"/>
                   </Trigger>
               </Style.Triggers>
          </Style>
     </ListView.ItemContainerStyle>

     <ListView.View>
          <GridView>
              <GridViewColumn>
              <TextBox ... Tag="{Binding}".../>
              </GridViewColumn>
              <GridViewColumn>
              <TextBox ... Tag="{Binding}".../>
              </GridViewColumn>
          </GridView>
     </ListView.View>
</ListView>
Другие вопросы по тегам