Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Blazor中禁用组件层次结构?_C#_Blazor_.net 5_Asp.net5 - Fatal编程技术网

C# 如何在Blazor中禁用组件层次结构?

C# 如何在Blazor中禁用组件层次结构?,c#,blazor,.net-5,asp.net5,C#,Blazor,.net 5,Asp.net5,我希望实现与WPF应用程序类似的效果,在WPF应用程序中,您有一个XAML层次结构,禁用一个祖先也会禁用其所有子级 我在Blazor组件中找不到任何类似的方法。 我试图研究级联参数和值,但我不确定我是否在正确的轨道上 假设我有一个如下所示的组件层次结构: 此处的所有组件都是从基本组件类继承的,IsEnabled属性被声明为公共属性。 每个组件的行为应根据其IsEnabled值而有所不同 例如: EditBox应禁用内部输入HTML标记,将CSS类附加到包装器标记等。 如果我只是禁用EditB

我希望实现与WPF应用程序类似的效果,在WPF应用程序中,您有一个XAML层次结构,禁用一个祖先也会禁用其所有子级

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

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


此处的所有组件都是从基本组件类继承的,
IsEnabled
属性被声明为公共属性。
每个组件的行为应根据其
IsEnabled
值而有所不同

例如:
EditBox
应禁用内部输入
HTML
标记,将CSS类附加到包装器标记等。 如果我只是禁用
EditBox
本身,它就像一个符咒,没有什么特别之处(第三个
ParagraphRow
)。
我希望在第二个
段落行
中得到相同的结果,其中该行本身已被禁用。在这里,我想对
组件进行一些禁用逻辑(标签的CSS类、验证逻辑更改等),但我也希望它的子级(本例中的
EditBox
)也以某种方式被“通知”被禁用,这样它就可以自行更新为禁用状态

我更喜欢一种解决方案,在这种解决方案中,我不必到处抛出绑定和级联值
标记
,这样它就可以“开箱即用”。
在Blazor体系结构中是否可能实现这一点?

您正在寻找:

正在运行:

请点击查看

简化:

基本组件:

@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;
}
您可以根据自己的需求自由更改所需内容。

您正在寻找:

正在运行:

请点击查看

简化:

基本组件:

@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;
}

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

这并不是我的目标。每个组件(EditBox、ParagraphRow和PanelContainer)都应该有一个IsEnabled属性,并且可以单独重写。启用状态的逻辑将取决于组件自己的IsEnabled是如何设置的,以及父级状态的结果。我在考虑修改您的解决方案,以便将此引用传递给整个链,以便每个组件都可以访问其最近的祖先,并实现一个基本方法来评估启用状态,该方法可用于评估其自身的。。。如果有意义的话。你的解决方案在我上面提到的修改下工作得非常完美。将此引用作为CascadingValue传递,并使用base方法评估状态,效果非常好。非常感谢。很高兴收到你的来信。正如我在回答“自由地改变你需要的,以满足你自己的需求”时提到的:)这并不是我的目标。每个组件(EditBox、ParagraphRow和PanelContainer)都应该有一个IsEnabled属性,并且可以单独重写。启用状态的逻辑将取决于组件自己的IsEnabled是如何设置的,以及父级状态的结果。我在考虑修改您的解决方案,以便将此引用传递给整个链,以便每个组件都可以访问其最近的祖先,并实现一个基本方法来评估启用状态,该方法可用于评估其自身的。。。如果有意义的话。你的解决方案在我上面提到的修改下工作得非常完美。将此引用作为CascadingValue传递,并使用base方法评估状态,效果非常好。非常感谢。很高兴收到你的来信。正如我在回答“可以自由更改您需要的内容以满足您自己的需求”时提到的那样:)
@inherits IsEnabledComp
EditBox: @ImEnabled