1

如果某个条件为假,我正在尝试制作一个禁用的按钮。对于常规按钮,这有效:

<button @disabled="!IsReady">Click me</button>
@code
{
    public bool IsReady { get; set; }
}

我正在使用具有以下MatButton版本的MatBlazor 库button

<MatButton Disabled="@!IsReady">Click me</MatButton>

后者不起作用:它给出以下错误:

组件属性不支持复杂内容(混合 C# 和标记)

在好的 ol' WPF 中,我们可能会在绑定中使用转换器,因此绑定的布尔值是反转的。这是 MatBlazor 的限制吗?

我看到的快速解决方案是执行以下操作:

<MatButton Disabled="@IsNotReady">Click me</MatButton>
@code
{
    public bool IsReady { get; set; }
    public bool IsNotReady => !IsReady;
}

有没有更好的办法?

4

2 回答 2

4

解决方案最终变得非常简单:您只需将 C# 代码用括号括起来:

<MatButton Disabled="@(!IsReady)">Click me</MatButton>
于 2020-10-27T07:32:19.463 回答
2

使用 @ 符号时,您通常会从 HTML 上下文切换到 C# 上下文。因此,当您说诸如 Disabled="@IsNotReady" 之类的内容时,它就可以正常工作。当您尝试做一些更复杂的事情时,即使只是一个“!” 运算符,这足以成为需要评估的东西,而不仅仅是对值的引用。因此,Blazor 要求您使用 @( /* code*/ ) 并期望它评估为可以呈现为输出的文本(在本例中为 html)。Blazor 需要文字、字段或属性。因此,您可以创建一个属性,例如:

private bool isNotReady => !isReady;

这可能看起来毫无意义,但实际上它更强大 - 您可以执行许多逻辑来评估为真/假或您需要呈现给某些子组件的任何类型。因此,这也可以被认为是更好的关注点分离。

因此,您的代码可能更像这样:

<MatButton Disabled="@IsNotReady">Click me</MatButton>
于 2021-01-06T13:44:12.797 回答