У меня есть 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
C
А после сортировки они выглядят так:
B
A
C
Если щелкнуть правой кнопкой мыши по второму ряду («A»), вы получите «B», потому что именно там была B, прежде чем модель была отсортирована. То же самое происходит с фильтрацией. Скажем, модель после фильтрации выглядит следующим образом:
A
C
Если щелкнуть правой кнопкой мыши по второму ряду («C»), вы все равно получите «B».
Есть идеи, как обойти это?