12

甲骨文文档对此不是很清楚,谷歌和必应也不是。

我可以(如在 WPF 中)绑定到 FXML 中的模型跳过 Java 中的绑定代码吗?

我确实在某处的博客上看到了类似 ${object.field} 的语法,但我不能确定。


后期编辑:我从事 XAML 开发(WPF、Silverlight、Windows Phone)已有好几年了,我已经习惯于在标记中表达数据绑定。此外,我在2011 年关于 FXExperience 的文章中读到

我可以稍微扭转一下,将绑定移动到 FXML 文档中。除了布局之外,这将允许工具处理数据绑定。请注意,由于 FXML 不支持双向绑定,因此以下代码今天无法使用,但我们正在努力修复该问题。

实际上它就像:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import fxmlapp.Model ?>

<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="fxmlapp.Sample">
    <fx:define>
        <Model fx:id="model" />
    </fx:define>
    <children>
        <TextField fx:id="firstNameField" text="${model.person.firstName}" />
        <Label fx:id="messageLabel" text="${model.person.firstName}" />
    </children>
</VBox>

因为它是在 2011 年的一篇文章中,所以事情本可以同时实施,但在这个方向上没有找到任何证据。因此,经过仔细搜索,我决定在这里问。

4

1 回答 1

17

我正在挖掘这个线程,因为 A)它没有解决方案和 B)我是一个无耻的点 theif。

编辑:谈到原来的问题,你的帖子是完全正确的,做一个(单向)绑定,语法是${fx_id_value},完全按照 OP 的例子写的。

在我看来,在 FXML 2.1 中添加了一些双向绑定的概念,按照javafx.fxml.FXMLLoader#BI_DIRECTIONAL_BINDING_PREFIX

/**
 * Prefix for bidirectional-binding expression resolution
 * @since JavaFX 2.1
 */
public static final String BI_DIRECTIONAL_BINDING_PREFIX = "#{";

不幸的是,在这之后,我们实际上在第 318 行只有一个用法javafx.fxml.FXMLLoader.Element#processPropertyAttribute

else if (isBidirectionalBindingExpression(value)) {
  throw constructLoadException(new UnsupportedOperationException("This feature is not currently enabled."));
}

在javafx错误跟踪器上进行搜索表明,这个暴露的 javadoc,#{作为符号引用,是一个错误,应该被删除。在我看来,这似乎是正在进行中的事情。但是,考虑到 JavaFX 当前存在的无数错误,如果我们直到 java 9 才看到它,我不会感到惊讶。

退后一步,您对文档的挫败感反映了我自己的情况(您的经历也是如此:我也是从 WPF 来到 JavaFX 的,当然我在这两者上花费的时间比我怀疑的要少得多)。使用 javafx 绑定表达式的最佳解决方案来自阅读com.sun.javafx.fxml.expression.Expression的源代码(警告!关于 com.sun 包的通常规则适用:它们是内部的并且它们有奇怪的许可问题,阅读该来源,风险自负!)。Expression.java 类是一个手写的解析器/编译器,用于使用 FXML 的 javafx 绑定表达式,使用反射作为其运行时。为什么他们不使用 ANTLR 或 JavaCC 我不知道。如果我们可以仅引用语法和侦听器,则阅读起来会容易得多。

通过阅读,我了解到您可以在${和分隔符之间使用表达式}。对我来说最常见的是:

<HBox>
  <CheckBox fx:id="abcCheckBox"/>
  <TextField disable="${ ! abcCheckBox.selected}"/>
</HBox>

类似于 XAML。它还支持加法、否定和其他常见事物,只要所有内容都引用 fx:id 的组件和属性(并且“控制器”是一个 fx:id 提供给您免费引用此 XML 的控制器)加载到)。

考虑到所有因素,我喜欢 javafx,但要获得像 C#、WPF、XAML 和 caliburn-micro 提供的深度绑定和集成功能还需要一段时间。

于 2015-11-16T02:50:21.507 回答