2010-05-27 43 views
0

我试图让一个标准的WPF列表框被动态填充,并为列表框中的每个项目单击时启动一个命令。 目前我有一个工作列表框,可以填充,每个项目将触发正确的命令,但为了激发命令,我必须单击列表项目两次。 即点击一次选择该项目,然后点击实际文本以激发该命令。为什么我需要在WPF列表框项目上点击两次以激发命令?

由于名单是动态创建的,我不得不创建列表项的数据模板:

<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> 

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

谢谢

回答

1

您确定点击超链接文本本身吗?我没有任何困难地运行你的代码,第一次点击链接为我工作。

更新:如果你的命令需要知道单击的列表项,你可以随时添加一个CommandParameter:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}"> 

然后在执行方法(因为你的列表框绑定到一个字符串列表):

public void Execute(object parameter) 
{ 
    MessageBox.Show("You clicked on " + parameter.ToString()); 
} 

更新2:要自动选择项目,你可以通过一个ListBoxItem为您CommandParameter:

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

,然后在命令中选择:

public void Execute(object parameter) 
{ 
    ListBoxItem itemClicked = (ListBoxItem)parameter; 
    itemClicked.IsSelected = true; 
    MessageBox.Show("You clicked on " + parameter.ToString()); 
} 
+0

是的,你说得对,该命令会被触发时,只需点击超链接的文本,但给人无所事事的外观。 命令执行方法需要选定的列表项目才能执行操作,但是仅当单击超链接文本时,列表项目才会被选中,因此无法执行操作。 那么,会改变列表项IsSelected属性的超链接上的数据触发器工作?是超链接元素是列表项的子项的问题吗? 谢谢 – Donal 2010-05-27 11:52:59

+0

@Donal,我更新了我的答案,为您提供了一个可能的解决方案,虽然它没有选择该项目 – 2010-05-27 12:00:45

+0

太棒了!谢谢,你的代码工作。出于某种原因,我忽略了使用CommandParameter。查找祖先绑定似乎也很有用。 – Donal 2010-05-27 12:26:48

相关问题