我試圖創建一個虛擬應用程序來維護任務列表。JavaFX - 有關綁定按鈕的禁用狀態的問題
現在,我正在嘗試添加到列表中。我在文本框中輸入任務名稱,單擊添加任務按鈕,並期望列表中的新項目和要清除的任務名稱輸入被更新。我只想在任務名稱不爲空的情況下添加任務。下面的代碼是我的實現,但我有一個關於綁定的問題。
我將文本框的文本變量綁定到我的視圖模型中的字符串,並將按鈕的禁用變量綁定到我的視圖模型中的布爾值。
我有一個觸發器來更新任務名稱更改時的禁用狀態。當任務名稱的綁定發生時,布爾值會相應更新,但該按鈕仍然顯示爲禁用。但是,當我將鼠標放在按鈕上時,它變爲啓用。我相信這是由於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
]
}
]
}
}
注意:onKeyTyped方法用於確保文本框在用戶輸入時更新模型,而不是在失去焦點時更新模型,並且更新cmdAddButton狀態。 – jamiebarrow 2010-05-27 07:51:49