c# - 如何禁用 Blazor 中的组件层次结构?
问题描述
我想在 WPF 应用程序中实现类似的效果,其中您有一个 XAML 层次结构,并且禁用其中一个祖先会使其所有子级也被禁用。
我在 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>
这里的所有组件都继承自一个基组件类,其中IsEnabled
属性被声明为公共属性。
每个组件应根据其IsEnabled
值表现不同。
例如:
应该EditBox
禁用内部输入HTML
标签,将 CSS 类附加到包装标签等。如果我只是禁用它EditBox
本身,它就像一个魅力,没什么好看的(第三个ParagraphRow
)。
我想获得与第二个相同的结果ParagraphRow
,其中行本身已被禁用。在这里,我想对row
组件进行一些禁用逻辑(标签的 CSS 类,验证逻辑更改等),但我也希望它的子组件(EditBox
在这种情况下)也以某种方式被“通知”被禁用,因此它可以自行更新为禁用状态。
我更喜欢这样的解决方案,我不必在tags
所有地方都抛出绑定和级联值,因此它可以“开箱即用”。
在 Blazor 架构中甚至有可能吗?
解决方案
您正在寻找CascadingValues 和参数:
在行动:
在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
可以根据自己的要求自由更改您需要的内容。
推荐阅读
- php - laravel 获取仅通过电子邮件验证的用户列表
- hyperledger-fabric - 使用 softHSM:为什么我的订购者仍在 Orderer.General.TLS.Privatekey 路径上寻找私钥?
- python - 无法在python中清理csv文件
- reactjs - TypeError:无法读取未定义反应本机抽屉的属性“导航”
- wpf - 在不同的地方设置 TabItem 标题
- elasticsearch - 将数据从原始 Elasticsearch 索引移动到另一个具有更多分片数或增加现有索引中的分片数的索引
- c# - 将 char* C 函数编组为 C#
- python - Python无法使用docker连接到mysql
- python - 如何每2分钟给一个数字加1?
- r - 如何定义一定数量的嵌套 for 循环(基于 R Shiny 应用程序中的输入长度)?