Skip to content
Vadim Gordeev edited this page Apr 12, 2024 · 8 revisions

Общее описание

Это наш биндинг(связывание) для GTK виджетов. Изначально развивался в отдельном проекте, поэтому имеет отличное называние, но потом было решено перенести его в общий репозиторий с библиотеками. Папка Binding.

Treeview

Виджет таблички которую колонки которой можно связать и полям класса в списке.

Пример настройки таблички

ytreeviewRatings.ColumnsConfig = ColumnsConfigFactory.Create<Rating>()
				.AddColumn("Дата").AddReadOnlyTextRenderer(n => n.CreateTime.ToString("g"))
				.AddColumn("Отправитель").AddTextRenderer(node => node.UserPhone)
				.AddColumn("Оценка").AddNumericRenderer(node => node.Rating_)
				.AddColumn("Номенклатура")
					.Binding(b => b.AddBinding(ViewModel, v => v.NomenclatureColumnVisible, col => col.Visible).InitializeFromSource())
					.AddTextRenderer(n => ViewModel.GetNomenclatureName(n))
				.AddColumn("Описание").AddTextRenderer(node => node.Description)
                                .RowCells().AddSetter<Gtk.CellRendererText>((c, x) => c.Foreground = x.Archival? "gray": null)
				.Finish();

Табличка настраивается через Fluent интерфейс, часть свойств можно задавать для колонки часть для рендеров(условно ячейки). Обратите внимание в одной колонке может быть несколько рендеров, это нормально, работать это будет как будто в колонке есть 2 подколонки одинаковой ширины, но выглядящая как одна ячейка. Например можно добавить картинку и текст.

AddColumn

Добавляет настройку новой колонки. Далее можно задать ей разные параметры:

  • Visible - видимость
  • HeaderAlignment - выравнивание
  • MinWidth - Минимальная ширина
  • Resizable - Возможность менять ширину колонки в интерфейсе. С переносами не работает - просто обрезает
  • Tag - Возможность добавить объект тега на колонку, чтобы по нему можно было ее найти.
  • EnterToNextCell - Перехват нажатия Enter, чтобы при нажатии пользователь не просто закончил редактирование текущей ячейки, а перескочил сразу на редактирование следующей ячейки в следующей строке. Удобно для ввода данных вертикально.
  • ClickedEvent - Подвязывания события клика по ?(заголовку) колонки
  • Binding - Позволяет установить биндинг для свойств колонки на какой нибудь объект. Работает аналогично биндингу виджетов.
  • ToolTipText - устанавливает функцию получения всплывающей подсказки для ячеек колонки.

Add*Renderer

В GTK рендер это не класс самой ячейки, это класс который знает как ячейку отрисовывать. То есть поменяв у рендера свойство фона или текста, вы поменяете фон или текст для всех ячеек. Учитывайте эту специфику GTK, вы не можете установить какое-то свойство для конкретной ячейки на всегда. Но наш биндинг позволяет настроить сеттеры, Рендер перед отрисовкой каждой ячейки будет применять(вычислять) все сеттеры проставляя через них свойства рендера, и отрисовывать ячейку. Далее выполнять сеттеры для другой ячейки и отрисовывать ее и т.д. Сеттеры можно добавить через через AddSetter. Основное свойство обычно поле которое отображается, предается через конструктор. Обратите внимание и основное поле с сетеры вызываются каждый раз при отрисовке ячейки, то есть очень часто, поэтому не используйте в медленные методы или расчеты и тем более не обращайтесь по сети к базе данных.

Типы ячеек(рендеров)

  • ComboRenderer - Ячейка с комбобоксом(выпадающий список)
  • DateRenderer - Ячейка для редактирование даты
  • EnumRenderer - Ячейка с выпадающим списком значений Enum
  • NumberRenderer - Числовая ячейка, поле редактирования со стрелочками вверх вниз
  • PixbufRenderer - Ячейка отображающая картинку или иконку
  • ProgressRenderer - Ячейка отображающая прогресс бар
  • ReadOnlyTextRenderer - Текстовая ячейка, без возможности редактирования чтобы можно было указывать сложные функции расчета отображаемого текста
  • TextRenderer - Обычная текстовая ячейка с возможностью редактирования
  • ToggleRenderer - Ячейка с галочкой

Общие для всех рендеров настройки

  • .AddSetter((c,n) => c.Background = n.BgColor) - Позволяет устанавливать любое свойство рендера. Может быть применено к рендеру несколько раз для установки разных свойств. В лямбде с это ячейка, а n это строка таблицы.

AddComboRenderer

Элементами списка может быть любой тип, отдельно нужно передавать список

Можно передать следующие параметры:

  • Tag - Возможность добавить объект тега на рендер, чтобы по нему можно было ее найти.
  • WrapWidth - Ширина в пикселях после которой необходимо переносить текст на следующую строку.
  • SetDisplayFunc - Функция для получения текста из объекта.
  • SetDisplayListFunc - Дополнительная функция позволяющая объекты пока они в списке выбора отображать под другому, чем когда они в самой ячейки.
  • Editing - Включение редактирования
  • EditedEvent - Возможность указать событие которое будет вызвано после завершения редактирования, то есть после выбора элемента списка.
  • HasEntry - Можно ли просто ввести значение, без списка.
  • XAlign - Выравнивание по горизонтали
  • YAlign - Выравнивание по вертикали
  • HideCondition - Возможность установить функцию которая будет определять, определять будет ли скрыт элемент списка.
  • FillItems - заполняет список значениями
  • DynamicFillListFunc - Функция для динамического получения списка, поляризуется в случае если для каждой ячейки список будет разным и его нужно формировать динамически перед редактирование ячейки.

AddTextRenderer

RowCells

Метод RowCells конфигурации таблицы позволяет устанавливать сеттеры на все ячейки нужного типа одновременно. Полезно для каких нибудь настроек целиком строки. Например мы целой строке хотим установить цвет фона или цвет текста. Можем использовать примерно такую конструкцию:

.RowCells().AddSetter<Gtk.CellRendererText>((c, x) => c.Foreground = x.Archival? "gray": "black")

здесь CellRendererText тип ячейки, для который будет установлен цвет, если ячейка(рендер) не может быть приведена к указанному типу, сеттер для ячейки применяются не будет. Обратите внимание что ячейки с выпадающем списками и числовые, унаследованы от текстовых, поэтому к ним тоже будут притеняться текстовые сеттеры.

Обратите внимание общие сеттеры применяемые ко всем ячейкам хоть и задаются последними при настройке, будут применяться к рендерам в первую очередь. То есть в ситуации когда сеттер строки с сеттер ячейки устанавливают одно и тоже свойство, например цвет. Сначала применяться сеттер строки, а потом значение цвета перезапишет сеттер ячейки. Это позволяет все ячейки в которых нет собственных сеттеров цвета сделать цветом строки, а ячейки с индивидуальными настройками сделать отличного от строки цвета.

Command binding

Для винджетов типа кнопок есть возможность биндить команды ICommand

На данный момент реализовано для виджетов: yButton, yMenuItem, yToggleButton

Как использовать:

У виджета вызвать метод BindCommand и передать туда требуемую команду. Sensitive свойство виджета будет зависеть от результата CanExecute команды.

Если необходимо в команду передавать аргумент, то в метод биндинга вторым аргументов можно передать функцию которая должна будет вернуть необъходимый команде аргумент при выполнении команды.

Пример:

buttonSave.BindCommand(ViewModel.SaveCommand);
Clone this wiki locally