【发布时间】:2014-12-17 06:50:52
【问题描述】:
我知道 Java 和 C#,但我只知道 C# MVVM 中的属性绑定。 我正在尝试使用属性值的自定义 getter 和 setter 来理解 JavaFX 中的属性绑定(如在 C# 中)。
我创建了以下类:
public class ViewModel {
private StringProperty name;
public ViewModel() {
name = new SimpleStringProperty();
}
public final String getName() {
return name.get();
}
public final void setName(String name) {
this.name.set(name);
}
public StringProperty getNameProperty() {
return name;
}
}
public class Controller implements Initializable {
@FXML
private TextField nameField;
private final ViewModel viewModel;
public Controller() {
viewModel = new ViewModel();
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
Bindings.bindBidirectional(nameField.textProperty(),
viewModel.getNameProperty());
}
}
我的印象是,如果我遵循推荐的 JavaBean/JavaFX 命名约定,那么绑定系统将足够聪明地使用反射(?)并为属性使用我的自定义 getter/setter。但我的视图模型 getter / setter 从未使用过。
相反,绑定直接使用属性的 get/set 方法,无需我的交互。 我读到我可以使用以下代码,但必须有比这更好的方法:
name = new SimpleStringProperty() {
@Override public void set(String value) {
// do something...
super.set(value);
}
};
我可以指定绑定应该使用哪些方法来获取/设置我的属性吗? 另外,我如何通知属性已更改(C# 中的 NotifyOfPropertyChange())而无需更改?
编辑:
我想要做的是对最终设置到我的属性的内容更具选择性,因为我想稍后使用它的值来填充我的数据模型(此处省略)。
在 C# 中这很简单,我只是在 setter 中设置了一个谓词。而且我可以通过设置其他属性来推动表单/向导的进展。
public String Property {
get { return _property; }
set {
if(SomePredicate(value)) {
_property = value;
_nextButtonCommand.canExecute() = true;
// notify...
}
}
}
【问题讨论】:
-
更新答案以响应编辑。
-
我实际上喜欢覆盖属性集。出于某种原因,在我的代码中,当我像下面的答案那样做时,setter 永远不会被调用。我只用 FXML 和我的模型做我的整个应用程序,但我的控制器没有代码。