如何在Mac中的NSTableView中拖放行

时间:2017-02-15 13:14:23

标签: xamarin xamarin.mac

我已经敲定了一点,现在我已经使用NSTableView得到了一个数据列表,但我的要求是,能够将这些行从一行位置拖放到另一行位置。请提出任何建议,以解决这个问题。提前致谢。enter image description here

My sample code

1 个答案:

答案 0 :(得分:2)

NSTableViewDataSource子类实现WriteRowsValidateDropAcceptDrop中,并注册NSTableView接受的拖放目标。在这种情况下,您只接受自己NSTableView内的Drop。

指定将用于此NSTableView的有效拖动操作的名称:

// Any name can be registered, I find using the class name 
// of the items in the datasource is cleaner than a const string
string DragDropType = typeof(Product).FullName;

注册NSTableView

的拖动类型
ProductTable.RegisterForDraggedTypes(new string[] { DragDropType }); 

NSTableViewDataSource上实施拖放方法:

public override bool WriteRows(NSTableView tableView, NSIndexSet rowIndexes, NSPasteboard pboard)
{
    var data = NSKeyedArchiver.ArchivedDataWithRootObject(rowIndexes);
    pboard.DeclareTypes(new string[] { DragDropType }, this);
    pboard.SetDataForType(data, DragDropType);
    return true;
}

public override NSDragOperation ValidateDrop(NSTableView tableView, NSDraggingInfo info, nint row, NSTableViewDropOperation dropOperation)
{
    tableView.SetDropRowDropOperation(row, dropOperation);
    return NSDragOperation.Move;
}

public override bool AcceptDrop(NSTableView tableView, NSDraggingInfo info, nint row, NSTableViewDropOperation dropOperation)
{
    var rowData = info.DraggingPasteboard.GetDataForType(DragDropType);
    if (rowData == null)
        return false;
    var dataArray = NSKeyedUnarchiver.UnarchiveObject(rowData) as NSIndexSet;
    Console.WriteLine($"{dataArray}");
    // Move hack for this example... you need to handle the complete NSIndexSet
    tableView.BeginUpdates();
    var tmpProduct = Products[(int)dataArray.FirstIndex];
    Products.RemoveAt((int)dataArray.FirstIndex);
    if (Products.Count == row - 1)
        Products.Insert((int)row - 1 , tmpProduct);
    else 
        Products.Insert((int)row, tmpProduct);
    tableView.ReloadData();
    tableView.EndUpdates();
    return true;
}