             to: #selector(NSOutlineViewDelegate.outlineView(_:heightOfRowByItem:)),
             map: { (dataSource: Element.UnderlyingCollection?, outlineView: NSOutlineView, item: Element.UnderlyingCollection?) -> CGFloat in
                 guard let dataSource = dataSource else { return outlineView.rowHeight }
-                return binder.height(for: item?.value, outlineView: outlineView, dataSource: dataSource) ?? outlineView.rowHeight
+                return binder.height(for: item, outlineView: outlineView, dataSource: dataSource) ?? outlineView.rowHeight
             }
         )
 

        self.createCell = nil
    }

    public init(isItemExpandable: ((TreeNode, TreeNode.Value?, NSOutlineView) -> Bool)? = nil, measureCell: ((TreeNode, TreeNode.Value?, NSOutlineView) -> CGFloat?)? = nil, createCell: ((TreeNode, TreeNode.Value?, NSTableColumn?, NSOutlineView) -> NSView?)? = nil) {
        self.isItemExpandable = isItemExpandable
        self.measureCell = measureCell
        self.createCell = createCell
    }

    open func isExpandable(for item: TreeNode.Value?, outlineView: NSOutlineView, dataSource: TreeNode) -> Bool {
        return self.isItemExpandable?(dataSource, item, outlineView) ?? false
    }

    open func height(for item: TreeNode.Value?, outlineView: NSOutlineView, dataSource: TreeNode) -> CGFloat? {
        return self.measureCell?(dataSource, item, outlineView) ?? outlineView.rowHeight
    }

    open func cell(for item: TreeNode.Value?, tableColumn: NSTableColumn?, outlineView: NSOutlineView, dataSource: TreeNode) -> NSView? {
        return self.createCell?(dataSource, item, tableColumn, outlineView) ?? nil
    }


            switch operation {
            case .insert(let at):
                let parent = rootNode[at.dropLast()]
                outlineView.insertItems(at: IndexSet(integer: at.last!), inParent: parent, withAnimation: insertAnimation ?? [])
            case .delete(let at):
                let parent = rootNode[at.dropLast()]
                outlineView.removeItems(at: IndexSet(integer: at.last!), inParent: parent, withAnimation: deleteAnimation ?? [])
            case .update(let at):
                let parent = rootNode[at.dropLast()]
                let item = outlineView.child(at.last!, ofItem: parent)
                outlineView.reloadItem(item)
            case .move(let from, let to):
                let fromParent = rootNode[from.dropLast()]
                let toParent = rootNode[to.dropLast()]
                outlineView.moveItem(at: from.last!, inParent: fromParent, to: to.last!, inParent: toParent)
            }
        }

