Merlin04, следующий фрагмент кода демонстрирует, как вы можете это сделать. Обратите внимание, что это действительно очень простой пример, но он показывает, как вам следует кодировать, когда требуется связь между удаленными компонентами.
Вот код, скопируйте и запустите его, и если у вас есть дополнительные вопросы, не стесняйтесь спросить.
MessageService.cs
public class MessageService
{
private string message;
public string Message
{
get => message;
set
{
if (message != value)
{
message = value;
if (Notify != null)
{
Notify?.Invoke();
}
}
}
}
public event Action Notify;
}
Примечание. Служба является обычным классом ... Она предоставляет службы другим объектам и должна быть добавлена в контейнер DI при запуске. Метод .ConfigureServices, чтобы сделать его доступным для запрашивающих клиентов. Добавьте это: в метод ConfigureServices:
services.AddScoped<MessageService>();
Примечание. Как видите, я определяю делегат события типа Action, который вызывается из метода доступа set свойства, когда пользователь вводит текст в текст коробка в Компоненте3. При запуске этого делегата текст, введенный Components3, будет отображаться в компоненте Index, который является родительским для Component2 (см. Код ниже).
Index.razor
@page "/"
@inject MessageService MessageService
@implements IDisposable
<p>I'm the parent of Component2. I've got a message from my grand child:
@MessageService.Message</p>
<Component2 />
@code {
protected override void OnInitialized()
{
MessageService.Notify += OnNotify;
}
public void OnNotify()
{
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
MessageService.Notify -= OnNotify;
}
}
Обратите внимание, что мы непосредственно привязать к свойству MessageService.Message, но метод StateHasChanged должен быть вызван для обновления sh отображения текста.
Component2.razor
<h3>Component2: I'm the parent of component three</h3>
<Component3/>
@code {
}
Component3.razor
@inject MessageService MessageService
<p>This is component3. Please type a message to my grand parent</p>
<input placeholder="Type a message to grandpa..." type="text"
@bind="@MessageService.Message" @bind:event="oninput" />
Обратите внимание, что в Component3 мы связываем MessageService.Message с текстовым полем, и привязка происходит каждый раз, когда вы нажимаете клавиатуру (событие ввода или событие изменения).
Вот и все, надеюсь, что это поможет, и не стесняйтесь задавать любые вопросы.