首页 文章

Tornadofx - 在构建时控制tableview行对象

提问于
浏览
0

我的要求有点类似于Angular为HTML网页提供的内容 .
基本上,在创建表时,迭代记录列表以获取记录,然后我们可以根据if条件删除行 . 像这样的东西:

ng-repeat = "record in records"
ng-if = "record.Id != 0"

同样在Tornadofx中,如果我想构建一个tableview,我这样做:

tableview<Record>(recordList) {
    //I want to remove row with the 0th recordId 
    column("Id", Record::Id)
    column("First Name", Record::firstNameProperty)
    column("Last Name", Record::lastNameProperty)
}

看到教程,我尝试了以下但没有运气:

val removeZeroId = booleanBinding(idProp, idProp) {
    id != "0"
}
visibleWhen {
    //compilation
    Record::removeZeroId
}

如果我可以在tableview中拥有行对象并对其执行操作,那将很容易 .

坦率地说,我还没有清楚地理解tornadofx绑定,所以我可能会遗漏一些基本的东西 .

1 回答

  • 2

    您应该使用 SortedFilteredList 过滤掉您不想要的项目 . 这样可以保持UI逻辑的清洁,因为您只对基础数据结构的视图进行操作 . 这与Angular不同,在为要显示的每条记录绘制表格行时,您必须决定这些内容 .

    SortedFilteredList 可以配置一个 predicate 函数,该函数传递一个记录并期望一个布尔值来确定当前记录是否应该在列表中可见 .

    class MyView : View() {
        val recordList = getYourListOfRecordsFromSomewhere()
        val data = SortedFilteredList(recordList)
    
        override val root = tableview(data) {
            column("Id", Record::idProperty)
            column("First Name", Record::firstNameProperty)
            column("Last Name", Record::lastNameProperty)
        }
    
        init {
            // Configure the filter predicate for the SortedFilteredList
            data.predicate = { it.id != 1 }
        }
    }
    

    另请注意,您可以随时更新过滤谓词 . 对谓词的更改将立即显示在显示的行中 .

相关问题