调用泛型子控件中的方法
我有一个名为InfoPanel的容器控件,它应该包含各种类型的其他控件的实例,但都来自名为InfoPanelControl的基类。InfoPanelControl定义了一个虚拟方法Save。
我想从InfoPanel中调用包含控件的保存方法,这样每个具体的控件都会执行自己的特定保存。
这就是它的样子:
<InfoPanel>
<Budget />
</InfoPanel>这里的预算是从InfoPanelControl派生出来的。
InfoPanel具有一个ChildControl属性:
[Parameter] private RenderFragment ChildContent { get; set; }它使用子控件的实例填充,在本例中它是预算。
现在,我需要从InfoPanelControl访问预算控件(作为InfoPanel,因为我不需要特定类型,只需要基本类型)。在InfoPanel中,我希望做以下工作:
InfoPanelControl childControl = ChildContent.Target as InfoPanelControl;然而,ChildContent.Target返回的不是投给InfoPanelControl的预算。它实际上是一个更高级别控件的实例,它是InfoPanel的容器。
我如何从InfoPanelControl访问预算(交由InfoPanel )控制的方法?
发布于 2019-06-30 09:52:01
奇怪的是,几天前我确实做了类似的事情。最后,我使用了级联参数/值来解决我的特定问题。下面我使用了一个简单的例子来展示一般的逻辑。
我希望在未来会有一个更好的解决方案,但在写作的时候,blazor还在预览中。
我还建议使用一个ChildControlBase来实现所有子控件继承的接口。
这个实现的另一个“好东西”是,它将工作在多个子组件中,这些子组件可能在'ChildContent‘中,而它周围的标记并不重要。
目前,我在OnParametersSet的重写中将子元素添加到父级。根据您的需要,您可能想要以不同的方式使用它,或者使用附加的逻辑。
ParentControlBase.cs
public class ParentControlBase : ComponentBase
{
private List<IDoSomething> _childControls;
public ParentControlBase()
{
_childControls = new List<IDoSomething>();
}
public void AddChildControl(IDoSomething control)
{
if (!_childControls.Contains(control))
{
_childControls.Add(control);
}
}
public void DoSomethingOnRelevantChildControls()
{
foreach (var control in _childControls)
{
control.DoSomething();
}
}
}ParentControl.razor
@inherits ParentControlBase
<div class="parent-control-container">
<div>Parent Control</div>
<CascadingValue Name="IDoSomethingParentControl" value="@this">
@ChildContent
</CascadingValue>
<div class="btn btn-primary" @onclick="@DoSomethingOnRelevantChildControls">Do Something</div>
</div>
@code{
[Parameter]
private RenderFragment ChildContent { get; set; }
}共同儿童控制实施
public interface IDoSomething
{
void DoSomething();
}ChildControl
@implements IDoSomething
<div>ChildControl</div>
@code
{
[CascadingParameter(Name = "IDoSomethingParentControl")]
private ParentControlBase CurrentParentControl { get; set; }
protected override void OnParametersSet()
{
if (CurrentParentControl != null)
{
CurrentParentControl.AddChildControl(this);
}
}
public void DoSomething()
{
//Do Something implementation
}
}https://stackoverflow.com/questions/56807836
复制相似问题