Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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_Blazor Server Side_Two Way Binding - Fatal编程技术网

C# 如何在Blazor中双向绑定级联值

C# 如何在Blazor中双向绑定级联值,c#,blazor,blazor-server-side,two-way-binding,C#,Blazor,Blazor Server Side,Two Way Binding,我在Blazor中使用自定义模板,试图找到一种双向级联值的方法或实现类似的功能。现在我有以下模板 @if (PopupVisible) { <DxPopup> <HeaderTemplate> <h4 class="modal-title">@HeaderText</h4> <button type="button" class="close" @onclick="@Up

我在Blazor中使用自定义模板,试图找到一种双向级联值的方法或实现类似的功能。现在我有以下模板

@if (PopupVisible)
{
    <DxPopup>
        <HeaderTemplate>
            <h4 class="modal-title">@HeaderText</h4>
            <button type="button" class="close" @onclick="@UpdatePopupVisible">&times;</button>
        </HeaderTemplate>
        <ChildContent>
            <div class="modal-body">
                <div class="container-fluid">
                  @bodyContent
                </div>
            </div>
            <div class="modal-footer">
                @footerContent
                <button class="btn btn-secondary" @onclick="UpdatePopupVisible">Cancel</button>
            </div>
        </ChildContent>
    </DxPopup>
}

@code {
    [CascadingParameter] public bool PopupVisible { get; set; }
    [CascadingParameter] public EventCallback<bool> PopupVisibleChanged { get; set; }

    [Parameter] public RenderFragment HeaderText { get; set; }
    [Parameter] public RenderFragment footerContent { get; set; }
    [Parameter] public RenderFragment bodyContent { get; set; }

    private async Task UpdatePopupVisible()
    {
        PopupVisible = false;
        await PopupVisibleChanged.InvokeAsync(PopupVisible);
    }
}
@if(弹出可见)
{
@标题文字
&时代;
@身体内容
@页脚内容
取消
}
@代码{
[CascadingParameter]公共bool PopupVisible{get;set;}
[CascadingParameter]公共事件回调PopupVisibleChanged{get;set;}
[参数]公共RenderFragment头文本{get;set;}
[参数]公共RenderFragment footerContent{get;set;}
[参数]公共RenderFragment bodyContent{get;set;}
私有异步任务UpdatePopupVisible()
{
PopupVisible=false;
等待PopupVisibleChanged.InvokeAsync(PopupVisibleChanged);
}
}

然后我有一个实现这个模板的组件(子组件),然后我有一个按钮调用的组件(父组件)。我想知道的是,是否有一种方法可以从父级绑定PopupVisible参数,而不必将其绑定到子级并让子级将其传递给模板。我还没有找到一种双向绑定级联参数的方法,但如果可能的话,我认为这是最好的方法。除此之外,我不确定是否还有其他方法,或者我将不得不接受我目前传递值的想法。

您不能使用级联参数进行双向绑定。级联意味着从父级流向子级,而不是从相反的方向

我不确定我是否理解您的问题…但是,如果您希望从父组件传递一个值并返回;您可以执行以下操作: 注意:这是一种双向组件数据绑定

子组件
@code
{
私有布尔可见;
[参数]
公共bool弹出窗口可见
{
获取{返回可见}
设置
{
如果(可见!=值)
{
可见=价值;
}
}
} 
[参数]公共事件回调PopupVisibleChanged{get;set;}
//调用EventCallback以使用新值更新父组件的可见私有字段。
私有任务UpdatePopupVisible()
{
PopupVisible=false;
返回PopupVisibleChanged.InvokeAsync(PopupVisibleChanged);
}
}
用法
@page/“
@代码{
私有布尔可见;
}

注意:如果您需要一些解释,并且相信我没有回答您的问题,请毫不犹豫地告诉我,但请花时间表达您的问题。。。我不能完全理解问题。

谢谢你回答我的问题!我理解双向数据绑定,但问题是我想绑定一个孩子的孩子。我将其设置为Parent->Child->template,我希望在父级和模板之间绑定popUpVisible,理想情况下不在Child中添加任何额外内容。您可以使用父级上的CascadingValue组件将popUpVisible的值从父级传递到模板化组件,以及在模板化组件上定义名为PopupVisible的CascadingParameter属性。但不能使用级联值更新模板化组件中传递的参数。相反,您可以定义一个可以从父组件(将服务注入父组件,为布尔属性赋值)和模板化组件访问的服务(将服务注入组件,读取父组件中设置的值,分配新值,现在父组件可以使用注入的服务访问新值)。您应该在Startup.ConfigureServices方法中将服务添加到DI容器中
@code
{
    private bool visible;
    [Parameter]
    public bool PopupVisible
    {
        get { return visible }
        set
        {
            if (visible != value)
            {
                visible = value;

            }
        }
    } 

   [Parameter] public EventCallback<bool> PopupVisibleChanged { get; set; }
   // Invoke the EventCallback to update the parent component' private field visible with the new value.

   private Task UpdatePopupVisible()
    {
        PopupVisible = false;
        return PopupVisibleChanged.InvokeAsync(PopupVisible);
    }
}
@page "/"

<DxPopup @bind-PopupVisible="visible" />

@code {
    private bool visible;
}