1

我正在使用 Statless.StateMachine 并且我面临一个触发器有两个状态的情况!让我解释一下,我有一个应用程序,当用户填写文本框时,我需要激活一些按钮,但同时,当用户清除文本框时,这些按钮将被停用。

我所做的是我创建了两个状态 Waiting 和 Editing。在等待时,按钮会被停用,而在编辑时,只要文本框不为空,按钮就会被激活。为了解决这个问题,我编写了以下代码:

_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 事件上触发哪个触发器来解决这个问题,但我觉得这违背了状态设计模式的目的,因为我需要控制状态而没有代码中的 if-else 混乱像 KeyUp (在 StateMachine 之外,因为 PermitIf 将自行决定)。

是状态设计模式的正确应用吗?还是我错过了什么?

4

0 回答 0