首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用泛型Blazor子控件中的方法

调用泛型Blazor子控件中的方法
EN

Stack Overflow用户
提问于 2019-06-28 13:28:03
回答 1查看 1.3K关注 0票数 0

调用泛型子控件中的方法

我有一个名为InfoPanel的容器控件,它应该包含各种类型的其他控件的实例,但都来自名为InfoPanelControl的基类。InfoPanelControl定义了一个虚拟方法Save。

我想从InfoPanel中调用包含控件的保存方法,这样每个具体的控件都会执行自己的特定保存。

这就是它的样子:

代码语言:javascript
复制
<InfoPanel>
    <Budget />
</InfoPanel>

这里的预算是从InfoPanelControl派生出来的。

InfoPanel具有一个ChildControl属性:

代码语言:javascript
复制
[Parameter] private RenderFragment ChildContent { get; set; }

它使用子控件的实例填充,在本例中它是预算。

现在,我需要从InfoPanelControl访问预算控件(作为InfoPanel,因为我不需要特定类型,只需要基本类型)。在InfoPanel中,我希望做以下工作:

代码语言:javascript
复制
InfoPanelControl childControl = ChildContent.Target as InfoPanelControl;

然而,ChildContent.Target返回的不是投给InfoPanelControl的预算。它实际上是一个更高级别控件的实例,它是InfoPanel的容器。

我如何从InfoPanelControl访问预算(交由InfoPanel )控制的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-30 09:52:01

奇怪的是,几天前我确实做了类似的事情。最后,我使用了级联参数/值来解决我的特定问题。下面我使用了一个简单的例子来展示一般的逻辑。

我希望在未来会有一个更好的解决方案,但在写作的时候,blazor还在预览中。

我还建议使用一个ChildControlBase来实现所有子控件继承的接口。

这个实现的另一个“好东西”是,它将工作在多个子组件中,这些子组件可能在'ChildContent‘中,而它周围的标记并不重要。

目前,我在OnParametersSet的重写中将子元素添加到父级。根据您的需要,您可能想要以不同的方式使用它,或者使用附加的逻辑。

ParentControlBase.cs

代码语言:javascript
复制
    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

代码语言:javascript
复制
@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; }
}

共同儿童控制实施

代码语言:javascript
复制
   public interface IDoSomething
    {
        void DoSomething();
    }

ChildControl

代码语言:javascript
复制
@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
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56807836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档