2

我有一个经过过滤然后排序的 ListStore。它看起来像这样:

// Create a model for the cards
cardListStore = new ListStore (typeof (Card));

// Set up the tree view
cardFilter = new TreeModelFilter (cardListStore, null);
cardFilter.VisibleFunc = new TreeModelFilterVisibleFunc (FilterCards);
cardSort = new TreeModelSort (cardFilter);
cardTreeView.Model = cardSort;

当我右键单击它时,我希望获得一个特定于每一行的上下文菜单。我的点击处理程序看起来像这样:

[GLib.ConnectBeforeAttribute]
void HandleCardTreeViewButtonPressEvent (object o, ButtonPressEventArgs args)
{
    if (args.Event.Button != 3)
        return;

    TreePath path;
    // If right click on empty space
    if (!cardTreeView.GetPathAtPos (Convert.ToInt32 (args.Event.X),
                                    Convert.ToInt32 (args.Event.Y),
                                    out path)) {
        MakeCardEmptySpaceContextMenu ().Popup ();
        return;
    }

    TreeIter iter;
    if (!cardListStore.GetIter (out iter, path))
        return;

    Card card = (Card) cardListStore.GetValue (iter, 0);

    MakeCardContextMenu (card, iter).Popup ();
}

这在 ListStore 未过滤或排序时有效。但是当它出现时,它给出了错误的行。

例如,假设行在排序之前看起来像这样:

甲乙丙
_
_

排序后,它们看起来像这样:

B
A
C

右键单击第二行(“A”)会给你“B”,因为那是模型排序之前 B 所在的位置。过滤也会发生同样的事情。说模型,过滤后的样子是这样的:


交流电_

右键单击第二行(“C”)仍然会给你“B”。

知道如何解决这个问题吗?

4

2 回答 2

2

我只需要从 cardSort 而不是 cardListStore 中获取 iter 和值。

if (!cardListStore.GetIter (out iter, path))
    return;

Card card = (Card) cardListStore.GetValue (iter, 0);

变成

if (!cardSort.GetIter (out iter, path))
    return;

Card card = (Card) cardSort.GetValue (iter, 0);
于 2010-02-10T14:23:04.807 回答
0

看起来您和数据之间有一个过滤器,这就是树显示的内容。您正在查看树后面的数据...

现在,我不熟悉 GTK,但也许像

TreeModelSort.convert_path_to_child_path ?

必须有一种方法可以获取您正在查看的模型视图的哪一行,然后将其转换回真实的模型数据。

于 2010-02-10T00:28:54.270 回答