Binding Matblazor组件属性:复杂内容

Binding Matblazor组件属性:复杂内容,binding,blazor,matblazor,Binding,Blazor,Matblazor,我试图使一个按钮是禁用的,如果某个条件是假的。对于常规按钮,此功能有效: <button @disabled="!IsReady">Click me</button> @code { public bool IsReady { get; set; } } 后者不起作用:它给出以下错误: 组件属性不支持复杂内容(混合C#和标记) 在好的ol'WPF中,我们可能会在绑定中使用转换器,因此绑定的布尔值是反向的。这是MatBlazor的限制吗 我看到

我试图使一个按钮是禁用的,如果某个条件是假的。对于常规按钮,此功能有效:

<button @disabled="!IsReady">Click me</button>
@code
{
    public bool IsReady { get; set; }
}
后者不起作用:它给出以下错误:

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

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

我看到的快速解决方案是:

<MatButton Disabled="@IsNotReady">Click me</MatButton>
@code
{
    public bool IsReady { get; set; }
    public bool IsNotReady => !IsReady;
}
点击我
@代码
{
公共bool已就绪{get;set;}
公共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>
点击我
<MatButton Disabled="@IsNotReady">Click me</MatButton>