Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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#_.net Core_Event Handling_Blazor - Fatal编程技术网

C# 如何在Blazor组件初始化中限制事件订阅

C# 如何在Blazor组件初始化中限制事件订阅,c#,.net-core,event-handling,blazor,C#,.net Core,Event Handling,Blazor,当我尝试在blazor组件初始化时订阅事件时,每次刷新或导航页面时,都会一次又一次地调用OnInitializedAsync方法,然后事件的调用列表会增加很多。如何限制仅连接一次 @code { [Parameter] public CustomerModel model { get; set; } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); mod

当我尝试在blazor组件初始化时订阅事件时,每次刷新或导航页面时,都会一次又一次地调用OnInitializedAsync方法,然后事件的调用列表会增加很多。如何限制仅连接一次

@code {
[Parameter]
public CustomerModel model { get; set; }


protected override async Task OnInitializedAsync()
{
    await base.OnInitializedAsync();
    model.PropertyChangedEvent += PropertyChanged;

}
}

通常,每当我绑定事件时,我总是先解除绑定。这是为了确保同一个处理程序只绑定一次

model.PropertyChangedEvent -= PropertyChanged;
model.PropertyChangedEvent += PropertyChanged;
取消订阅该活动

@实现IDisposable ... @代码{ [参数] 公共CustomerModel模型{get;set;} 受保护的重写异步任务OnInitializedAsync { 等待base.OnInitializedAsync; model.PropertyChangedEvent+=PropertyChanged; } 公共空间处置 { model.PropertyChangedEvent-=PropertyChanged; } }
这行不通。我尝试过,但它仍然添加订阅:attached is immediate widowns:model.PropertyChangedEvent.GetInvocationList{System.Delegate[4]}[0]:{Method={Void PropertyChanged}[1]:{Method={Void PropertyChanged}[2]:{Method={Void PropertyChanged}[3]:{Method={Void PropertyChanged}}仍然存在问题。我的模型类是singleton,但是当在其他选项卡或浏览器中打开同一页时,事件仍然会连接两次或更多次。我正在考虑尝试使用一个静态布尔变量来标记事件已连接,然后后续调用为ignore,但是我不确定页面的生命周期何时结束,创建新实例时会发生什么这将不适用于静态布尔,只有第一个页面实例将订阅您的事件。您希望的行为是什么?1页面/组件的每个实例只能订阅一次?2在您的CustomerModel单实例上,仅应订阅页面/组件实例。CustomerModel是singleton,只有一个实例,即使在许多选项卡或机器中打开相同的页面组件。当注入blazor组件时,我希望组件订阅模型的propertyChangedEvent,然后当模型有一些更改时,它将通知组件调用StateHasChanged值以更新UI。但是,由于每次导航页面时都会调用OnInitializedAsync方法,因此我仍然希望对事件进行一次订阅,以避免多次调用StateHasChanged。所以2是我想要的行为。你不希望每个组件都订阅并被通知propertychanges?,而只是第一个?如果每个组件只能订阅一次,那么@Alex-Tin Le的答案就是您想要的。如果一个组件只有一个实例需要订阅,那么您需要通过GetInvocationList等来检查它,并且只在没有实例的情况下订阅。在我的情况下,单个页面中的一个组件应该只订阅事件一次@Alex Tin Le解决方案不起作用。我试着在页面上来回导航,然后调用列表计数仍然在增加。我知道使用GetInvocationList方法,但它必须放在模型类的基类中,这不是向前的,因为它需要区分注册到事件的每个组件。希望blazor组件具有只调用一次的方法,就像Winformsas中的initializeComponent一样,根据您的信息,每次调用OnInitializedAsync时,它都位于组件的另一个实例中。因此,当导航到别处,然后再次导航到您的页面时,将创建第二个实例,并订阅该第二个实例。您可以通过在OnInitializedAsync中创建一个断点来验证这一点,并在此基础上创建一个ObjectId右键单击此->生成对象Id,第二次调用时相同,然后比较Id$1、$2、。。。。在这种情况下,这两个答案都是有效的。