WPF ListBox выбор не работает

У меня есть ListBox для нескольких элементов, и я должен иметь возможность щелкать по ним. Проблема в том, SelectionChanged событие не срабатывает, когда я нажимаю на текст элемента, только если я нажимаю на пустую часть. Я довольно новичок в WPF, и я не понимаю, почему это происходит.

XAML:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ListBoxItem Content="{Binding Name}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Обработчик:

private void lBoxVouchers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0)
        MessageBox.Show("You just selected " + e.AddedItems[0]);
}

Я связываю список объектов в коде через lBoxVouchers.ItemsSource собственность, и они появляются. Каждый объект имеет Name собственность, конечно.

Я попытался установить IsEnabled в ListBox и элементах, как в коде, так и в XAML, но это не помогает.

Любые комментарии о лучших способах сделать это в WPF также приветствуются.

3 ответа

Решение

Если вы хотите показать только свойство Name, вы можете определить свой список следующим образом:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged" DisplayMemberPath="Name" />

Если вы поместите свои элементы в ObservableCollection в коде позади, вы также можете передать привязку данных в XAML:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged" DisplayMemberPath="Name" ItemsSource={Binding Path=Items}" />

И в вашем коде должно быть что-то вроде:

ObservableCollection<object> Items {get; set}

Что касается обработчика, я бы также сделал что-то вроде этого:

private void lBoxVouchers_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    if (((ListBox)sender).SelectedItem != null)
        MessageBox.Show("You just selected " + (ListBox)sender).SelectedItem);
}

Может быть содержимое в элементе списка не растянуто. просто напишите этот стиль для элемента списка и попробуйте.

<Style TargetType="{x:Type ListBoxItem}">
  <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

Задавать IsSynchronizedWithCurrentItem="true" в списке.

Здесь вы можете найти отправную точку, чтобы получить более подробную информацию об этой собственности.

Если для этого свойства установлено значение true, выбор будет синхронизирован с текущим элементом, который содержит фактический выбранный элемент. Когда вы щелкаете пустое пространство, вероятно, текущий элемент меняется на ноль, и вы вызываете обработчик события.

Другие вопросы по тегам