如何为WPF Datagrid中的所有单元格设置事件

时间:2010-03-12 13:13:01

标签: wpf xaml wpf-controls wpfdatagrid

我的WPF Datagrid上的每个单元都需要OnDragEnter个事件。 我试过这个:

<ControlTemplate TargetType="{x:Type my:DataGridCell}" x:Key="RowTemplate">
    <ContentPresenter DragEnter="ContentPresenter_DragEnter" >
    </ContentPresenter>
</ControlTemplate>

但似乎没有用。人们有什么想法?


编辑:感谢您的回复,我意识到我遇到了另一个问题: 我真正的问题是TextBox控件始终将拖放事件标记为已处理,因此即使您设置AllowDrop="True",它看起来也会像AllowDrop一样无效。这不是一个bug,这种行为实际上是设计出来的。

我使用了预览事件来预测这一点,并且能够处理D'n'D事件。

<TextBox
    AllowDrop="True"
    PreviewDragEnter="TextBox_PreviewDragOver" 
    PreviewDragOver="TextBox_PreviewDragOver"  
    PreviewDrop="TextBox_PreviewDrop">
<TextBox/>

希望这有帮助。
我将您的回答标记为答案,因为它们对于最初的问题是准确的。

2 个答案:

答案 0 :(得分:2)

你很亲密。

您需要设置AllowDrop,并且需要将其设置为等级设置事件处理程序的级别。例如:

<ControlTemplate TargetType="{x:Type my:DataGridCell}" x:Key="RowTemplate"> 
  <ContentPresenter DragEnter="ContentPresenter_DragEnter" AllowDrop="true"> 
  </ContentPresenter> 
</ControlTemplate>

拖放事件仅发送给UIElements的{​​{1}}。从那里,他们在树上冒泡,直到处理完毕。

请注意,您可以在AllowDrop="true"本身而不是每个单元格上添加DragEnter处理程序,但如果您想了解哪个单元格是放置目标的信息,您仍应设置DataGrid在细胞层面。

答案 1 :(得分:1)

我很确定你需要在单元格上将AllowDrop属性设置为true。如果没有将此设置为true,则元素将不参与拖放事件。