Получить первый ряд упорядоченного Gtk TreeView (Gtk #) - PullRequest
0 голосов
/ 09 мая 2018

У меня есть Gtk # TreeView с одним видимым столбцом, модель которого содержит 3 значения (текст для видимого столбца, значение для сортировки дерева и ссылка на базовый объект). Вот код:

internal class JpgTreeView : TreeView
{
    private readonly ListStore _store = new ListStore(typeof(string), typeof(int), typeof(ITreeViewChoice));
    private TreeModelSort _sortedModel;

    private enum Column
    {
        Text,
        SortValue,
        Value
    }

    public JpgTreeView()
    {
        var valueColumn = new TreeViewColumn();
        AppendColumn(valueColumn);
        var visisbleColumnTextRenderer = new CellRendererText();
        valueColumn.PackStart(visisbleColumnTextRenderer, true);
        valueColumn.AddAttribute(visisbleColumnTextRenderer, "text", (int) Column.Text);

        _sortedModel = new TreeModelSort(_store);
        _sortedModel.SetSortColumnId((int) Column.SortValue, SortType.Descending);
        _sortedModel.SetSortFunc((int) Column.SortValue, (model, a, b) =>
        {
            var aval = (int) model.GetValue(a, (int) Column.SortValue);
            var bval = (int) model.GetValue(b, (int) Column.SortValue);
            return aval.CompareTo(bval);
        });
        Model = _sortedModel;
    }

Сортировка работает правильно, но функция _store.GetIterFirst всегда возвращает исходную первую строку (т.е. первую строку в несортированном списке). _sortedModel.GetIterFirst возвращает следующее сообщение об ошибке:

gtk_list_store_get_value: assertion 'iter_is_valid (iter, list_store)' failed

Я заполняю TreeView с помощью этой функции:

public void SetChoices(IEnumerable<ITreeViewChoice> choices)
{
    _store.Clear();
    foreach (var choice in choices)
    {
        _store.AppendValues(choice.GetChoiceText(), 1, choice);
    }
}

Как получить первый ряд отсортированного списка?

1 Ответ

0 голосов
/ 12 мая 2018

_sortedModel.GetIterFirst - правильный способ получения первой строки упорядоченного Gtk TreeView (TreeModelSort)

Проблема, с которой я столкнулся, заключалась в том, что я использовал строку, возвращенную из TreeModelSort в ListStore, которая недопустима. то есть это правильно:

_sortedModel.GetIterFirst(out var iter);
var value = _sortedModel.GetValue(iter, (int) Column.Value);

И это неправильно (что я делал):

_sortedModel.GetIterFirst(out var iter);
var value = _store.GetValue(iter, (int) Column.Value);
...