我有一个已过滤然后排序的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进行过滤或排序时,此方法有效。但是当它出现时,它会给出错误的行。
例如,假设行在排序之前看起来像这样:
一个
乙
ç
在对它们进行排序后,它们看起来像这样:
乙
一个
ç
右键单击第二行(“A”)将为您提供“B”,因为这是B在模型排序之前的位置。过滤也会发生同样的事情。假设模型在过滤后看起来像这样:
一个
ç
右键单击第二行(“C”)仍会显示“B”。
任何想法如何解决这个问题?
答案 0 :(得分:2)
我只需要从cardSort获取iter和值,而不是cardListStore。
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);
答案 1 :(得分:0)
看起来你和数据之间有一个过滤器,这就是树所显示的内容。你正在看树后面的数据...
现在,我对GTK并不熟悉,但也许就像
TreeModelSort.convert_path_to_child_path ?
必须有办法获得您正在查看的MODEL的VIEW行,然后将其转换回实际模型数据。