StateMachine (один триггер с двумя состояниями) - PullRequest
0 голосов
/ 30 апреля 2020

Я использую 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 будет принимать решение самостоятельно).

Является ли правильное применение шаблона проектирования состояний? Или я что-то пропустил?

...