Щелчок/фокус на содержимом ListBoxItem не всплывает

У меня есть ListBox, объявленный следующим образом:

<ListBox ItemsSource="{Binding Contracts}" SelectedItem="{Binding SelectedContract}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <ListBoxItem Content="{Binding Name}">
        <ListBoxItem.ToolTip>
          <Grid>
            [code omitted for reasons of clarity]
          </Grid>
        </ListBoxItem.ToolTip>
      </ListBoxItem>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Я ожидал нормального поведения выбора, так как я играю с ToolTip элемента, а не со структурой его содержимого. Однако щелчок по имени элемента не фокусирует/выбирает этот элемент. Только щелкнув это крошечное пространство между каждым элементом (самый простой способ - это пространство между именем элемента и границей ListBox), элемент становится сфокусированным/выбранным.

Конечно, я погуглил и подумал, что нашел виновника (событие не всплывает). Но любое решение, представленное здесь, на SO или где-либо еще, например. грамм. добавление такого кода:

<ListBoxItem.Style>
  <Style TargetType="ListBoxItem">
    <Style.Triggers>
      <Trigger Property="IsKeyboardFocusWithin" Value="True">
        <Setter Property="IsSelected" Value="True" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBoxItem.Style>

оказалось не решением проблемы. Итак, я предполагаю, что делаю что-то не так, и я просто слишком слеп, чтобы это увидеть. И хотя могут быть решения с использованием кода программной части, я предпочитаю придерживаться чистого и чистого XAML.

Пожалуйста, помогите мне понять мою ошибку и решить ее.


person Yoda    schedule 18.10.2016    source источник


Ответы (1)


если целью является добавление всплывающей подсказки для ListBoxItem, вы можете использовать ItemContainerStyle. ListBox создает ListBoxItems для каждого элемента с привязкой к данным, добавление ListBoxItem в DataTemplate не требуется, если это нарушает некоторые функции, старайтесь избегать этого.

<ListBox>

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
            <Setter Property="ToolTip">
                <Setter.Value>
                    <Grid>
                        <TextBlock Text="{Binding .}"/>
                    </Grid>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding .}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>

</ListBox>

изменить: я использовал приложение Snoop, чтобы проверить ваш вариант с помощью ListBoxItem в DataTemplate. В визуальном дереве каждого элемента ListBox есть 2 ListBoxItems, возможно, один из них предотвращает выбор другого

person ASh    schedule 18.10.2016
comment
Большое спасибо, что указали мне на Snoop и неправильный DataTemplate контент! Я просто забыл а) об этом инструменте (некоторое время я разрабатывал с помощью WPF) и б) что DataTemplate в этом случае используется для определения content ListBoxItem, чтобы не быть введением для определения одного . Поэтому я с радостью принимаю ваш ответ. :) - person Yoda; 18.10.2016