Я пытаюсь создать фиктивное приложение, которое поддерживает список задач.
Пока все, что я пытаюсь сделать, это добавить в список. Я ввожу имя задачи в текстовое поле, нажимаю кнопку «Добавить задачу» и ожидаю, что список будет обновлен новым элементом, а ввод имени задачи будет очищен. Я хочу иметь возможность добавлять задачи, только если имя задачи не пустое. Приведенный ниже код является моей реализацией, но у меня есть вопрос относительно привязки.
Я связываю текстовую переменную текстового поля со строкой в моей модели представления, а переменную отключения кнопки с логическим значением в моей модели представления.
У меня есть триггер для обновления отключенного состояния при изменении имени задачи. Когда происходит привязка имени задачи, логическое значение обновляется соответствующим образом, но кнопка по-прежнему кажется отключенной. Но затем, когда я наводю курсор мыши на кнопку, она становится активной. Я полагаю, что это связано с тем, что привязка 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
]
}
]
}
}