c# - 如何使单击 ListBoxItem 内的按钮选择项目?
问题描述
我有一个ListBox
定义如下:
<ListBox
DisplayMember="Name"
ItemsSource="{Binding Persons}"
ItemTemplate="{StaticResource PeopleDataTemplate}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
Name="listOfPeople">
</ListBox>
该类Person
包含两个属性:
public string FirstName { get; set; }
public string LastName { get; set; }
XAML:
<UserControl.Resources>
<DataTemplate x:Key="PeopleDataTemplate">
<StackPanel>
<Image
Width="75"
Height="75"
Source="{Binding Picture}">
</Image>
<TextBlock FontSize="14" TextWrapping="Wrap" Text="{Binding Name}" />
<Button Command="{Binding DataContext.AddCommand , ElementName=main}" Content="Add" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
如果我单击Image
,ListBoxItem
则会被选中,但如果我单击Button
,ListBoxItem
则不会被选中。为什么?
解决方案
为什么项目没有被选中?
TL;DR:因为鼠标按下事件由 处理,Button
并且永远不会到达ListBoxItem
.
触发IsSelected
每个属性的ListBoxItem
是声明MouseRightButtonDownEvent
的路由事件,其处理被here覆盖。然而,这是一个冒泡的路由事件,这意味着它会爬上可视化树,直到标记为在途中被某物处理:UIElement
ListBoxItem
MouseDownEvent
- 如果您单击您的
Image
:Image
接收MouseDown
但不处理它。它冒泡StackPanel
,同样的故事。气泡达ListBoxItem
. 宾果游戏,它在那里处理并调用父项上的一个方法,ListBox
将项目标记为选中。 - 如果单击 your
Button
然而:Button
接收MouseDown
事件并立即将其标记为Handled
here。事件传播被停止,并且事件永远不会冒泡到ListBoxItem
永远不会被选中的事件。
如何解决这个问题?
MVVM 方式
在您的AddCommand
实现中,添加一些代码以将IsSelected
属性更改为true
. 由于您绑定到IsSelected
,这将选择您的ListBoxItem
.
XAML 方式
将Click
事件处理程序添加到Button
以手动将其父标记ListBoxItem
为Selected
.
正如@Sinatr 所指出的,您还可以对焦点事件做出反应以选择任何获得焦点的项目。例如,订阅GotFocus
您每个人的事件StackPanel
并找到父级ListBox
(您调用UnselectAll()
)并找到父级ListBoxItem
(您调用Focus()
)。
推荐阅读
- java - Eclipse 字符串缓存错误,== 没有按预期工作
- apache-nifi - NiFi:没有 Web UI 的生产使用
- javascript - 使用 Vue 隐藏或显示元素时,MDL 样式会丢失
- javascript - 如何将父组件的子组件包装在 HOC 中并在 React 中呈现它们?
- html - CSS - 将 flexbox 下拉菜单置于内容之上
- c - 语言标准版本与编译器版本
- javascript - 如何根据语言环境确定年、月、日排序?
- java - 布局中的视图在设计或蓝图中不可见(即使对于 Hello World 应用程序)
- excel - 在 Excel 中与 MATCH/ROW 重复
- ios - 使用 firebase 检索图像给出:EXC_BAD_ACCESS (code=1, address=0x10)