Matblazor组件属性:复杂内容

问题描述

如果某个条件为假,我正在尝试使按钮禁用。对于常规按钮,此方法有效:

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

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

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

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

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

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

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

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

有更好的方法吗?

解决方法

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

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

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

private bool isNotReady => !isReady;

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

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

<MatButton Disabled="@IsNotReady">Click me</MatButton>