【问题标题】:Binding a JavaFx ListView's selection index to an integer property将 JavaFx ListView 的选择索引绑定到整数属性
【发布时间】:2015-09-25 12:19:22
【问题描述】:

是否可以(单向)将 ListView 的选择索引或项目绑定到属性?

我可以通过此调用获得 ReadOnlyIntegerProperty,但它是 ReadOnlyProperty,它没有您在 ObjectPropertyStringProperty 等中看到的绑定方法。

myListView.getSelectionModel().selectedIndexProperty()

如何将整数属性绑定到我的 ListView 的选定索引属性?

【问题讨论】:

  • 即使您已经接受了答案,您仍然应该澄清这个问题,以使其对其他用户更有帮助。看起来您想要“将整数绑定到 ListView 的选择”,而不是反过来(反过来就是你在问题的标题和第一句中都有它的方式)。另外:“我可以理解不允许双向绑定,因为它是只读的......而且,为什么不允许双向绑定”是自相矛盾的。 (你在这里的真正意思是什么?)
  • @James_D 我同意。我已经编辑以澄清标题和问题。
  • 标题还是和你接受的答案相反...

标签: java listview data-binding javafx


【解决方案1】:

API 将selectedIndex 公开为ReadOnlyProperty,因为它不想公开作为Property API 一部分的bind 方法。它不想暴露bind 方法的原因是ListView 需要能够在用户单击它时设置属性。如果bind 方法是API 的一部分,并且程序员调用了listView.getSelectionModel().selectedIndexProperty().bind(...),那么每当用户单击列表时都会产生运行时错误。

因为bindBidirectional 也是Property API 的一部分,但不是ReadOnlyProperty API,这意味着您也不能双向绑定selectedIndex

你可以使用两个监听器达到与双向绑定相同的效果:

IntegerProperty property = new SimpleIntegerProperty();
ListView<?> listView = new ListView<?>();

// change property when selection changes:
listView.getSelectionModel().selectedIndexProperty().addListener((obs, oldIndex, newIndex) ->
    property.set(newIndex.intValue()));

// change selection when property changes:
property.addListener((obs, oldValue, newValue) -> 
    listView.getSelectionModel().clearAndSelect(newValue.intValue())); 

如果只想将选中项索引绑定到属性,只需要第二个监听器即可。

如果你只是想将属性绑定到选中项的索引,而不打算通过其他方式设置属性,那么当然可以只绑定属性:

IntegerProperty property = new SimpleIntegerProperty();
property.bind(listView.getSelectionModel().selectedIndexProperty());

(尽管在这种情况下,如果您的设计允许,您始终可以直接引用 selectedIndexProperty。)

【讨论】:

  • 如果我不想要双向绑定,我不需要第二个监听器,对吧?如果有人修改了 IntegerProperty,我相信听众正在设置选择,是吗?
  • 是的,在这两种情况下都是正确的。但是,如果您只想在选择更改时更改属性,并且不打算直接设置属性,则可以为此使用绑定。
  • 是的,你说的其实就是我想要的。不过,您提供的信息很有帮助。所以,我相信我可以只做@Puce 的回答来做单向绑定。
  • 但是可以设置双向绑定属性,AFAIK,不是吗?
  • 好吧,这个问题很混乱:“我可以理解不允许双向绑定,因为它是只读的......而且,为什么不允许双向绑定?” :)。但我还是试图澄清答案。
【解决方案2】:

我可以理解不允许双向绑定,因为它已被读取 只有,但我怎样才能做一种方式绑定?

试试:

IntegerProperty property = new SimpleIntegerProperty();
property.bind(myListView.getSelectionModel().selectedIndexProperty());

【讨论】:

  • 在大多数情况下,如果您要这样做,property 就变得多余了,因为您可以只公开selectedIndexProperty 以获得相同的效果。另外,请注意,虽然这似乎是 OP 想要的,但这并不是他实际要求的:这“将属性绑定到选择”,而不是“将选择绑定到属性”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2018-10-24
相关资源
最近更新 更多