Привязка данных таблицы в Go Fyne

# #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)) , потому что привязки типизированы, но содержимое карты данных нетипизировано.