# #go #user-interface #fyne
Вопрос:
Новичок Файн здесь.
Есть простой вариант использования, который я пытаюсь решить, не находя никакого решения в документах: в Fyne, как создать виджет таблицы, данные которого привязаны к источнику данных?
Другими словами, у нас есть binding.BindStringList
в документах, что позволяет привязать список строк…
data := binding.BindStringList(
amp;[]string{"Item 1", "Item 2", "Item 3"},
)
…Я ищу что-то подобное, что позволило бы связать список структур вместо строки. Например, таблица задач:
type Todo struct {
UserID int `json:"userId,omitempty"`
ID int `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Completed bool `json:"completed,omitempty"`
}
Если это невозможно, каков, на ваш взгляд, наилучший обходной путь?
Ну, следуя предложению Энди, я попробовал это:
var data []Todo
stringData := `[{"userId":1,"id":1,"title":"delectus aut autem"},{"userId":1,"id":2,"title":"quis ut nam facilis et officia qui"}]`
json.Unmarshal([]byte(stringData), amp;data)
var bindings []binding.DataMap
for _, todo := range data {
bindings = append(bindings, binding.BindStruct(amp;todo))
}
list := widget.NewTable(
func() (int, int) {
return len(bindings), 4
},
func() fyne.CanvasObject {
return widget.NewLabel("wide content")
},
func(i widget.TableCellID, o fyne.CanvasObject) {
title, _ := bindings[i.Row].GetItem("Title")
log.Println(title)
o.(*widget.Label).SetText(title)
}
)
Мне не удается получить доступ к фактическим значениям моих элементов (т. Е. к названию). Не могли бы вы помочь?
Ответ №1:
К сожалению, в настоящее время виджета с привязкой к данным нет Table
. В версии 2.1 мы планируем добавить binding.BindMapList
то, что будет передано NewTableWithData
. В предстоящем выпуске.
До тех пор вы можете сохранить фрагмент binding.DataMap
элементов и получить доступ к элементам в нем, чтобы связать отдельные элементы внутри методов обратного вызова обновления таблицы.
Комментарии:
1. Спасибо за ваш быстрый ответ Энди, эта новая функция в версии 2.1 звучит действительно захватывающе. Собираюсь попробовать обходной путь до тех пор 😉
2. Я пытался использовать
binding.DataMap
, но безуспешно. Я что-то упускаю, но не могу исправить свой код. Я обновил свой первоначальный пост: не могли бы вы, пожалуйста, взглянуть?3. Ваш код действительно близок к работе, я думаю, это просто обратный вызов обновления. Вы бы использовали результат
GetItem
для привязки метки, например: « функция(i виджет. Скатертью клетка, о файн. CanvasObject) { заголовок, _ := привязки[i.Строка]. GetItem(«Заголовок») o.(*виджет. Этикетка). Привязка(название) } «4. Ого! Я попробовал ваш код, но он все еще жалуется на
cannot use title (type binding.DataItem) as type binding.String in argument to o.(*"fyne.io/fyne/v2/widget".Label).Bind: binding.DataItem does not implement binding.String (missing Get method)
🙁5. Извиняюсь, вам нужно ввести элемент данных, а я забыл. Попробуйте
Bind(title.(binding.String))
, потому что привязки типизированы, но содержимое карты данных нетипизировано.