为什么我需要在WPF列表框项目上单击两次才能触发命令?

为什么我需要在WPF列表框项目上单击两次才能触发命令?,wpf,listbox,Wpf,Listbox,我试图动态填充一个标准的WPF列表框,并在单击列表框中的每个项目时启动一个命令。 目前,我有一个工作列表框,可以填充,每个项目都将触发正确的命令,但为了触发命令,我必须单击列表项两次。 i、 e,单击一次以选择项目,然后单击实际文本以触发命令 由于列表是动态创建的,因此我必须为列表项创建一个数据模板: <ListBox.ItemTemplate> <DataTemplate> <TextBlock Margin="4,2,4,2">

我试图动态填充一个标准的WPF列表框,并在单击列表框中的每个项目时启动一个命令。 目前,我有一个工作列表框,可以填充,每个项目都将触发正确的命令,但为了触发命令,我必须单击列表项两次。 i、 e,单击一次以选择项目,然后单击实际文本以触发命令

由于列表是动态创建的,因此我必须为列表项创建一个数据模板:

<ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock Margin="4,2,4,2">
          <Hyperlink TextDecorations="None" Command="MyCommands:CommandsRegistry.OpenPanel">
            <TextBlock Text="{Binding}" Margin="4,2,4,2"/>
          </Hyperlink>
        </TextBlock>
      </DataTemplate>
 </ListBox.ItemTemplate>

基本上,我如何消除点击两次的需要?我曾尝试在选中列表框项目时使用事件触发器在超链接元素上触发单击事件,但无法使其正常工作。 或者,是否有更好的方法动态填充列表框并将命令附加到每个列表项


谢谢

你确定要点击超链接文本本身吗?我在运行你的代码时没有遇到任何困难,第一次点击链接对我来说很有效

更新:如果命令需要知道单击了哪个列表项,则始终可以添加CommandParameter:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}">
<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
更新2:要自动选择项目,可以将ListBoxItem作为CommandParameter传递:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}">
<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">

你确定要点击超链接文本本身吗?我在运行你的代码时没有遇到任何困难,第一次点击链接对我来说很有效

更新:如果命令需要知道单击了哪个列表项,则始终可以添加CommandParameter:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}">
<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
更新2:要自动选择项目,可以将ListBoxItem作为CommandParameter传递:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}">
<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">

是的,你说得对,只要点击超链接文本,命令就会启动,但看起来什么也不做。命令执行方法需要选定的列表项才能执行操作,但仅单击超链接文本时,列表项未被选中,因此无法执行操作。那么,超链接上更改列表项IsSelected属性的数据触发器是否有效?超级链接元素是列表项的子元素是否有问题?Thanks@Donal,我已经更新了我的答案,为您提供了一个可能的解决方案,尽管它没有选择项目太棒了!谢谢,你的代码成功了。出于某种原因,我忽略了使用CommandParameter。“查找祖先”绑定似乎也非常有用。是的,您是对的,只要单击超链接文本,该命令就会触发,但看起来什么也不做。命令执行方法需要选定的列表项才能执行操作,但仅单击超链接文本时,列表项未被选中,因此无法执行操作。那么,超链接上更改列表项IsSelected属性的数据触发器是否有效?超级链接元素是列表项的子元素是否有问题?Thanks@Donal,我已经更新了我的答案,为您提供了一个可能的解决方案,尽管它没有选择项目太棒了!谢谢,你的代码成功了。出于某种原因,我忽略了使用CommandParameter。查找祖先绑定似乎也非常有用。