2

我有几个项目的 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属性。

我已经尝试在代码和 XAML 中对 ListBox 和项目设置 IsEnabled,但它没有帮助。

也欢迎任何有关在 WPF 中执行此操作的更好方法的评论。

4

3 回答 3

2

如果您只想显示 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);
}
于 2010-11-15T12:52:01.620 回答
0

设置IsSynchronizedWithCurrentItem="true"在列表框上。

在这里,您可以找到获取有关此属性的更多详细信息的起点。

将此属性设置为 true 会使选择与保存实际选定项目的当前项目同步。当您单击空白区域时,当前项目可能更改为 null 并且您会调用事件处理程序。

于 2010-11-15T12:35:31.210 回答
0

可能是列表框项中的内容没有被拉伸。只需为列表框项编写此样式并尝试。

<Style TargetType="{x:Type ListBoxItem}">
  <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
于 2010-11-15T13:05:52.727 回答