WPF从列表框中拖放对象

时间:2016-12-26 13:46:55

标签: c# wpf

初学者。

我正在尝试使用其他控件中的一个列表框创建一个usercontrol,我希望此列表框允许拖放到其他类似的usercontrol实例。

这是我想要从一个列表框拖放到另一个列表框的对象:

[Serializable]
public class ListBoxFileName : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private string FileNameValue;
    public string FileName
    {
        get { return this.FileNameValue; }

        set
        {
            if (value != this.FileNameValue)
            {
                this.FileNameValue = value;
                NotifyPropertyChanged("FileName");
            }
        }
    }

    private bool FileIsSelectedValue;
    public bool FileIsSelected
    {
        get { return this.FileIsSelectedValue; }

        set
        {
            if (value != this.FileIsSelectedValue)
            {
                this.FileIsSelectedValue = value;
                NotifyPropertyChanged("FileIsSelected");
            }
        }
    }
}

以下是我处理拖放的方法:

    private ListBoxItem _dragged;

    private void FileNameList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (_dragged != null)
            return;

        UIElement element = FileNameList.InputHitTest(e.GetPosition(FileNameList)) as UIElement;
        while (element != null)
        {
            if (element is ListBoxItem)
            {
                _dragged = (ListBoxItem)element;
                break;
            }
            element = VisualTreeHelper.GetParent(element) as UIElement;
        }
    }


    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (_dragged == null)
            return;
        if (e.LeftButton == MouseButtonState.Released)
        {
            _dragged = null;
            return;
        }
        DataObject obj = new DataObject(DataFormats.Serializable, _dragged);
        DragDrop.DoDragDrop(_dragged, obj, DragDropEffects.All);
    }

    private void FileNameList_DragEnter(object sender, DragEventArgs e)
    {
        if (_dragged == null || e.Data.GetDataPresent(DataFormats.Serializable, true) == false)
            e.Effects = DragDropEffects.None;
        else
            e.Effects = DragDropEffects.All;
    }

    private void FileListBox_Drop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
        {
            string[] droppedFilePaths = e.Data.GetData(DataFormats.FileDrop, true) as string[];
            for (var i = 0; i < droppedFilePaths.Length; i++)
            {
                ListBoxFileName filename = new ListBoxFileName();
                filename.FileName = droppedFilePaths[i];
                filename.FileIsSelected = false;
                FileNamesItems.Add(filename);
            }
        }
        if (e.Data.GetDataPresent(DataFormats.Serializable, true))
        {
            ListBoxFileName BoxItem = new ListBoxFileName();
            BoxItem = e.Data.GetData(DataFormats.Serializable) as ListBoxFileName;
        }
    }

一切都很好,除非发生丢弃事件,BoxItem由于某种原因始终为空,因此没有任何内容添加到列表框中。

任何提示?

谢谢

1 个答案:

答案 0 :(得分:1)

DataObject的数据应该是ListBoxFileName而不是ListBoxItem:

private void Window_MouseMove(object sender, MouseEventArgs e)
{
    if (_dragged == null)
        return;
    if (e.LeftButton == MouseButtonState.Released)
    {
        _dragged = null;
        return;
    }
    DataObject obj = new DataObject(DataFormats.Serializable, _dragged.DataContext as ListBoxFileName);
    DragDrop.DoDragDrop(_dragged, obj, DragDropEffects.All);
}

private void FileListBox_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Serializable, true))
    {
        ListBoxFileName BoxItem = e.Data.GetData(DataFormats.Serializable) as ListBoxFileName;
        //...
    }
}

这应该可以使用&#34; FileNameList&#34;的ItemSource。 control设置为IEnumerable。

如果您需要任何进一步的帮助,请提供所需的所有相关代码段,以便能够从头开始重现您的问题。