Я использую Statless.StateMachine и сталкиваюсь с ситуацией, когда у меня один триггер с двумя состояниями! Позвольте мне объяснить, у меня есть приложение, в котором мне нужно активировать некоторые кнопки, когда пользователь заполняет текстовое поле, но в то же время эти кнопки будут деактивированы, когда пользователь очищает текстовое поле.
Что я сделал является то, что я создал два состояния ожидания и редактирования. При ожидании кнопки деактивируются, а при редактировании кнопки активируются до тех пор, пока текстовое поле не пустое. Чтобы решить эту проблему, я написал следующий код:
_machine.Configure(State.ChoiceWaiting)
.OnEntry(() => Setup())
.PermitIf(Trigger.Edit, State.Editing, () => CheckEditing())
.PermitReentryIf(Trigger.Wait, () => !CheckEditing());
_machine.Configure(State.Editing)
.OnEntry(() => Setup2())
.PermitIf(Trigger.Wait, State.ChoiceWaiting, () => !CheckEditing())
.PermitIf(Trigger.Edit, State.ChoiceWaiting, () => !CheckEditing())
.PermitReentryIf(Trigger.Edit, () => CheckEditing());
Теперь событие KeyUp для текстового поля:
private void TextBlock_KeyUp(object sender, KeyEventArgs e)
{
_machine.Fire(Trigger.Edit);
}
предыдущий код работает нормально, проблема возникает при нажатии клавиши Backspace во время текстовое поле пусто
System.InvalidOperationException: триггер «Редактировать» действителен для перехода из состояния «ChoiceWaiting», но условия защиты не выполнены. Описания охранника: 'Функция
Я знаю, что могу решить проблему, имея условие для определения, какой триггер срабатывать при событии KeyUp, но я чувствую, что по необходимости мне не нужно назначение State Design Pattern. управлять состояниями без беспорядка if-else внутри кода, такого как KeyUp (за пределами StateMachine, поскольку PermitIf будет принимать решение самостоятельно).
Является ли правильное применение шаблона проектирования состояний? Или я что-то пропустил?