DataGrid拖放目标:根据放置目标更改图标

时间:2013-05-17 16:09:26

标签: c# drag-and-drop silverlight-5.0 silverlight-toolkit

我目前正在编写一个工具,通过拖放操作将实体从一个{​​{1}}分配到另一个DataGrid中的实体。
通过一些摆弄,我得到了一切顺利运行,只有一个小烦恼:有些实体无法分配给其他实体,但尚未反映UI(尚未)。

因此,我想要实现的行为如下:当用户将受让人拖过另一个实体时,如果实体不兼容,则图标应更改为“您不能放弃此处”图标。

这是我的代码(附加到目标DataGrid的{​​{1}}事件):

DataGridDragDropTarget.DragOver

到目前为止我尝试过:

我已将DataGridprivate void DragDropTarget_OnDragOver(object sender, Microsoft.Windows.DragEventArgs e) { var sw = sender as DataGridDragDropTarget; if (sw == null) { return; } if(GetAssignmentCondition(e)) { // TODO: Show link-icon } else { // TODO: Show drop-disabled-icon } } 的{​​{1}}属性和基础e.Effects的{​​{1}}和DragDropTarget设置为{ {1}},无济于事。谷歌搜索也没有产生任何有意义的结果,我没有想法。

2 个答案:

答案 0 :(得分:2)

这适用于TextBoxFlowDocument控件的情况,因此它应与DataGrid一起使用。

此处的关键是将事件设置为Handled,以防止控件执行其恶作剧。

像这样:

代码背后(仅用于演示 - 最好使用更多MVVM友好的解决方案):

private void DragDropTarget_DragEnter(object sender, Microsoft.Windows.DragEventArgs e)
{
    var sw = sender as DataGridDragDropTarget;

    if (sw == null)
    {
        return;
    }

    if(GetAssignmentCondition(e))
    {
        // TODO: Show link-icon
        e.Effects = DragDropEffects.Link;
    }
    else
    {
        // TODO: Show drop-disabled-icon
        e.Effects = DragDropEffects.None;
    }

    // Add this
    e.Handled = true;
}

答案 1 :(得分:1)

更改Effects事件处理程序中DragEventArgs的{​​{1}}属性而不将OnDragOver属性设置为'true'不起作用,因为您可以在此处看到DragDropTarget.cs源代码。如果未在任何事件处理程序中处理HandledOnDragOver),则args.Handled=true;将恢复为args.Effects

args.AllowedEffects