2010-03-12 1 views
0

Мне нужно OnDragEnter событие для каждой ячейки моего WPF Datagrid. Я попытался это:Как установить событие для всех ячеек в WPF Datagrid

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

Но не похоже на работу. Любые идеи людей?


Edit: Спасибо за ответы, я понял, что я столкнулся с другой проблемой, хотя: Моя реальная проблема заключалась в том, что TextBox управления всегда отмечает события перетаскивания, как обрабатываются так, даже если вы установили AllowDrop="True" будет выглядеть как AllowDrop не работает. Это не ошибка, это поведение на самом деле по дизайну.

Я использовал предварительные события, чтобы предвидеть это, и иметь возможность обрабатывать события D'n'D.

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

Надеюсь, это поможет.
Я отмечаю ваши ответы как ответы, поскольку они были точны относительно начального вопроса.

+0

Я не пробовал это, поэтому я не буду размещать его в качестве ответа, но, согласно документам, событие DragEnter является барботируемым маршрутизируемым событием, поэтому вы должны иметь возможность обрабатывать его на уровне DataGrid и DragEnter события на клетках будут «пузыряться». Недостаток этого не будет работать, если элемент нижнего уровня, такой как ячейка, отмечает событие как обработанное, хотя вы можете обойти это, вызвав «AddHandler» в коде с 'handledEventsToo', установленным в true, т.е.' AddHandler (DragDrop. DragEnterEvent, myDragHandler, true) '. – itowlson

ответ

2

Вы близко.

Вам необходимо установить AllowDrop, и вам необходимо установить его ниже или ниже уровня, установленного обработчиком событий. Например:

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

Drag/События капли направляются только UIElements, которые имеют AllowDrop="true". Оттуда они пузыряют дерево до тех пор, пока они не будут обработаны.

Обратите внимание, что вы можете добавить DragEnter обработчик на самом DataGrid, а не на каждой клетке, но если вы хотите получить информацию, на которой клетка является целью снижения вы все еще должны установить AllowDrop="true" на клеточном уровне.

1

Я уверен, что вам нужно установить свойство AllowDrop в ячейку true. Если этот параметр не установлен в true, элемент не будет участвовать в событиях перетаскивания.

Смежные вопросы