我有几个项目的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
属性。
我尝试在ListBox和项目中设置IsEnabled,包括代码和XAML,但它没有帮助。
欢迎任何关于在WPF中更好地实现此方法的评论。
答案 0 :(得分: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);
}
答案 1 :(得分:0)
在列表框中设置IsSynchronizedWithCurrentItem="true"
。
Here您可以找到一个起点来获取有关此属性的更多详细信息。
将此属性设置为true会使选择与保存实际所选项目的当前项目同步。当您单击空白区域时,当前项可能会更改为null,并且您将调用事件处理程序。
答案 2 :(得分:0)
可能是列表框项中的内容未被拉伸。只需为列表框项目编写此样式并尝试。
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>