2011-08-28 140 views
7

我正在使用ItemsControl来显示数据绑定项目的列表,DataTemplate的每个核心都是一个Grid,我已经放置了所有绑定的控件。WPF中的可点击ItemsControl项目

我希望能够点击列表中每个项目的整个区域。但我无法弄清楚如何使区域可点击。

关于如何使整个网格区域可点击的任何建议将是伟大的。

+0

究竟是什么导致了这个问题我试图理解为什么会发生这种情况。不应该点击一个项目导致预览鼠标事件隧道树下的treeviewitem?或者treeviewitem不是鼠标事件的焦点?我认为鼠标事件是基于命中测试提出的,它会得到视觉树上的最内层元素(我认为它会是treeviewitem),然后将其作为事件的目标 –

回答

4

您可以使用AttachedCommandBehavior classes from C# Disciples来实现此目的。

在ViewModel中定义一个命令,然后在Grid对象上使用ACB AttachedProperties将MouseLeftButtonUp事件绑定到该命令。

一些代码来让你开始:

 <Grid Name="grid" Height="30" ForceCursor="True" Cursor="Hand"> 
      <acb:CommandBehaviorCollection.Behaviors> 
       <acb:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding Path=DataContext.EditEventCommand, RelativeSource={RelativeSource AncestorType={x:Type self:Dashboard}}}" CommandParameter="{Binding}" /> 
      </acb:CommandBehaviorCollection.Behaviors> 
     </Grid> 

编辑非MVVM解决方案。

当您没有根据MVVM指南设计应用程序时,上述代码段仍然可以工作,因为您本质上只是绑定到代码隐藏中的命令。

但是,如果你不想去定义命令的麻烦,你可以简单地指定勾,像这样的事件:

在XAML文件<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp">

,并在后台代码:

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
    }   
+0

如果我不使用MVVM? (老实说不知道如何...) –

+0

是的,这将仍然工作时不使用MVVM - 但我已经用一些额外的代码更新了我的答案。请注意,这将在MouseUp上触发,而不是Click。如果你想点击触发,你将需要捕获MouseDown和Up事件,启动一个计时器来测量每个事件之间的时间,然后相应地触发。 – fatty

14

为了使事情点击你通常可以把它包装在一个按钮,如果它应该是“看不见”的,您可以更改模板:

<Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <ContentPresenter /> 
    </ControlTemplate> 
</Button.Template> 
+1

+1:对于我的生活,我无法相信在四年中我一直在XAML写作,我从来没有想过这样做。 – fatty

+0

@fatty:哦哇;我不能相信,大多数控件都有各种鼠标事件,但不是简单的点击,也许他们认为这个按钮将是无用的,因为无论如何,任何东西都可以被设置为一个样式([这里是我的一个相关问题] (http://stackoverflow.com/questions/4830164/what-is-the-best-way-to-simulate-a-click-with-mouseup-mousedown-events-or-other)) –

+0

不错的一个,它很疯狂想想当你一遍又一遍地做同样的事情时,你可以得到怎样的感受。不能等到我能从这块岩石下面获得体面的'网络连接,我似乎生活在这个岩石下。 – fatty