フィルタリングされてから並べ替えられた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
2番目の行(「A」)を右クリックすると「B」が表示されます。これは、モデルが並べ替えられる前のBの場所であるためです。フィルタリングについても同じことが起こります。フィルタリングされた後のモデルは、次のようになります。
A
C
2番目の行(「C」)を右クリックすると、「B」が表示されます。
これを回避する方法はありますか?