如何禁用 Blazor 中的组件层次结构?

How to disable the component hierarchy in Blazor?

我想实现与 WPF 应用程序类似的效果,在 WPF 应用程序中,您有一个 XAML 层次结构,禁用其中一个祖先会使它的所有 children 也被禁用。

我在 Blazor 组件中找不到任何类似的方法。
我尝试查看级联参数和值,但不确定我是否在正确的轨道上。

假设我有一个如下所示的组件层次结构:

<PanelContainer Title="Upload log file">
   <ParagraphRow ParagraphType="ParagraphType.Paragraph1" Label="Some test row">
      <EditBox Text="Some test text" />
   </ParagraphRow>
   <ParagraphRow ParagraphType="ParagraphType.Paragraph2" Label="Some fancy test row disabled" IsEnabled="false">
      <EditBox Text="Some fancy test text" />
   </ParagraphRow>
   <ParagraphRow ParagraphType="ParagraphType.Paragraph3" Label="Some other test row">
      <EditBox Text="Some disabled test text" IsEnabled="false" />
   </ParagraphRow>
</PanelContainer>

这里的所有组件都是从基础组件 class 继承的,其中 IsEnabled 属性 被声明为 public 属性.
每个组件的行为应根据其 IsEnabled 值而有所不同。

例如:
EditBox 应该禁用内部输入 HTML 标签,将 CSS class 附加到包装标签等。 如果我只是禁用 EditBox 本身,它就像一个魅力,没什么特别的(第三个 ParagraphRow)。
我想得到与第二个 ParagraphRow 相同的结果,其中行本身已被禁用。在这里我想对 row 组件做一些禁用逻辑(CSS class 用于标签,验证逻辑更改等等 ),但我也希望它的children(在这种情况下是EditBox)也能以某种方式“通知”它被禁用,这样它就可以自行更新到禁用状态。

我更喜欢这样一种解决方案,我不必在所有地方抛出绑定和级联值 tags,这样它就可以 “正常工作”的盒子。
在 Blazor 架构中甚至可能吗?

您正在寻找CascadingValues and Parameters

正在行动:

Blazor REPL 查看。

简化:

基础组件:

@code{
    [CascadingParameter]
    public bool IsEnabled { get; set; } = true;
    public string ImEnabled => IsEnabled?"Enabled":"Disabled";
}

使用组件:

<PanelContainer IsEnabled="isEnabled">
  <ParagraphRow >
    <EditBox />
  </ParagraphRow>
</PanelContainer>
<button @onclick="()=>{isEnabled = !isEnabled;}" >Toggle</button>
@code {
    protected bool isEnabled = true;
}

面板容器

<h1>PanelContainer</h1>
<div style="padding-left:10px;">
    <CascadingValue Value="IsEnabled">
    @ChildContent
    </CascadingValue>
</div>
@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
    [Parameter]
    public bool IsEnabled {get; set; }
}

段落行

@inherits IsEnabledComp

Rapragraph: @ImEnabled
<div style="padding-left:10px;">
    <CascadingValue Value="IsEnabled">
    @ChildContent
    </CascadingValue>
</div>
@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
}

编辑框

@inherits IsEnabledComp
EditBox: @ImEnabled

可以根据自己的要求自由更改需要的内容。