使 WPF ListBoxItems 可选择

发布于 2024-08-07 03:19:24 字数 931 浏览 4 评论 0原文

我有一个 ListBox,其中定义了一个相当简单的 ItemTemplate - 包含一个 TextBlock 和一个 Button。这显示如预期,但有一个问题。当我单击 ListBoxItem 的内容(即文本或按钮)时,不会在 ListBox 中选择该行。如果我单击该行的空白部分,它就会执行。我希望当我单击该行上的任意位置时选择 ListBoxItem 。要实现这一目标需要什么?

<ListBox ItemsSource="{Binding SomeElements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ListBoxItem Selected="ListBoxItem_Selected">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                    <Button>Click</Button>
                </StackPanel>                                                
            </ListBoxItem>                                            
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

I have a ListBox with a rather simple ItemTemplate defined - containing a TextBlock and a Button. This displays like expected, but there is a problem though. When I click the content of the ListBoxItem, i.e. the text or the button, the line doesn't get selected in the ListBox. If I click the blank parts of the line it does. I'd like the ListBoxItem to be selected when I click anywhere on the line. What's needed to achieve this?

<ListBox ItemsSource="{Binding SomeElements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ListBoxItem Selected="ListBoxItem_Selected">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                    <Button>Click</Button>
                </StackPanel>                                                
            </ListBoxItem>                                            
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野心澎湃 2024-08-14 03:19:24

@Natrium不,这里的问题不同,

  1. 您需要删除DataTemplate内的ListBoxItem。 DataTemplate 不能有项目 ListBoxItem,并且它将无法正常工作。无论您在 DataTemplate 中定义什么,都会在运行时自动放入 ListBoxItem 中,因此在您的情况下,这就是它所创建的内容。
ListBoxItem
    数据模板
        列表框项目
            堆栈面板...
  1. 如果你想跟踪选择事件,那么你应该只捕获ListBox.SelectionChange事件,你不需要跟踪ListBoxItem_Selected。

将您的代码更改为此。

<ListBox ItemsSource="{Binding SomeElements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                    <Button>Click</Button>
                </StackPanel>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

@Natrium Nope, the problem is different here,

  1. You need to remove ListBoxItem inside DataTemplate. DataTemplate can not have item ListBoxItem, and it will not work correctly. Whatever you define in DataTemplate is automatically put inside ListBoxItem at runtime, so in your case, this is what it gets created.
ListBoxItem
    DataTemplate
        ListBoxItem
            StackPanel...
  1. If you want to track selection event, then you should only catch ListBox.SelectionChange event, you dont need to track ListBoxItem_Selected.

Change your code to this.

<ListBox ItemsSource="{Binding SomeElements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                    <Button>Click</Button>
                </StackPanel>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文