我正在尝试创建一个维护任务列表的虚拟应用程序。
现在,我要做的就是添加到列表中。我在文本框中输入任务名称,单击添加任务按钮,并期望使用新项目和要清除的任务名称输入更新列表。如果任务名称不为空,我只希望能够添加任务。下面的代码是我的实现,但我有一个关于绑定的问题。
我将文本框的文本变量绑定到视图模型中的字符串,并将按钮的禁用变量绑定到视图模型中的布尔值。
我有一个触发器,可以在任务名称更改时更新禁用状态。当任务名称的绑定发生时,布尔值会相应更新,但按钮仍然显示为禁用。但是当我将鼠标悬停在按钮上时,它就会启用。我相信这是因为JavaFX 1.3的绑定是懒惰的 - 只有在读取时才更新绑定变量。
此外,当我添加任务时,我清除模型中的任务名称,但文本框的文本不会更改 - 即使我正在使用bind with inverse
。
有没有办法让文本框的文本和按钮的禁用状态通过绑定自动更新,如我所料?
谢谢,
詹姆斯
AddTaskViewModel.fx:
package jamiebarrow;
import java.lang.System;
public class AddTaskViewModel {
function logChange(prop:String,oldValue,newValue):Void {
println("{System.currentTimeMillis()} : {prop} [{oldValue}] to [{newValue}] ");
}
public var newTaskName: String on replace old {
logChange("newTaskName",old,newTaskName);
isAddTaskDisabled = (newTaskName == null or newTaskName.trim().length() == 0);
};
public var isAddTaskDisabled: Boolean on replace old {
logChange("isAddTaskDisabled",old,isAddTaskDisabled);
};
public var taskItems = [] on replace old {
logChange("taskItems",old,taskItems);
};
public function addTask() {
insert newTaskName into taskItems;
newTaskName = "";
}
}
Main.fx:
package jamiebarrow;
import javafx.scene.control.Button;
import javafx.scene.control.TextBox;
import javafx.scene.control.ListView;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.layout.HBox;
def viewModel = AddTaskViewModel{};
var txtName: TextBox = TextBox {
text: bind viewModel.newTaskName with inverse
onKeyTyped: onKeyTyped
};
function onKeyTyped(event): Void {
txtName.commit(); // ensures model is updated
cmdAddTask.disable = viewModel.isAddTaskDisabled;// the binding only occurs lazily, so this is needed
}
var cmdAddTask = Button {
text: "Add"
disable: bind viewModel.isAddTaskDisabled with inverse
action: onAddTask
};
function onAddTask(): Void {
viewModel.addTask();
}
var lstTasks = ListView {
items: bind viewModel.taskItems with inverse
};
Stage {
scene: Scene {
content: [
VBox {
content: [
HBox {
content: [
txtName,
cmdAddTask
]
},
lstTasks
]
}
]
}
}
答案 0 :(得分:1)
为了记录,这个问题已在question regarding binding button’s disabled state主题中得到解答。
简短摘要:JavaFX 1.3中存在bind with inverse
对象中字段的错误。有一种解决方法,但它打破了封装。