Вы не выложили достаточно кода, чтобы я мог многое добавить к go в качестве предложений, но есть несколько способов взаимодействия компонентов друг с другом.
Вы можете использовать каскадирование Значения и дочерние компоненты смогут ссылаться на родителя следующим образом:
<CascadingValue Value="GalleryManager">
<ArtistListViewer></ArtistListViewer>
<ImageListViewer></ImageListViewer>
</CascadingValue>
Здесь мои компоненты ArtistListViewer и ImageListViewer могут ссылаться на менеджер галереи с этим свойством:
[CascadingParameter]
GalleryManager GalleryManager { get; set; }
При слишком частом использовании это может привести к проблемам с производительностью, в зависимости от загруженности вашего сайта.
Я написал сообщение в блоге о другом способе:
Использование интерфейсов для связи между компонентами https://datajugglerblazor.blogspot.com/2020/01/how-to-use-interfaces-to-communicate.html
Если вы отправляете что-нибудь сложное, я предпочитаю метод, описанный выше, где родительский объект - это IBlazorComponentParent, а дочерний объект - это IBlazorComponent.
Nuget Package: DataJuggler.Blazor .Components
Вот как вы можете настроить свойство Parent для ребенка следующим образом:
<Login OnLogin="LoginComplete" Parent=this></Login>
Parent = это возможно, потому что мой логин компонент - это IBlazorComponent, а моя страница индекса - это IBlazorComponentParent.
Дочерний установщик регистрируется в Parent следующим образом:
public IBlazorComponentParent Parent
{
get { return parent; }
set
{
// set the parent
parent = value;
// if the value for HasParent is true
if (HasParent)
{
// Register with the parent to receive messages from the parent
Parent.Register(this);
}
}
}
Событие Register на странице индекса сохраняет дочерний элемент как свойство:
public void Register(IBlazorComponent component)
{
// If the component object exists
if (NullHelper.Exists(component, Children))
{
// If this is the Login component
if (component.Name == "Login")
{
// Set the Signup control
this.Login = component as Login;
}
// add this child
Children.Add(component);
}
}
На данный момент мой компонент Login знает о своем родителе, а родительская страница Index имеет компонент Login в качестве переменной.
Затем вы можете отправить сообщение с чем угодно Вам нравится.
В моем методе входа в систему я отправляю сообщение родителю:
// if the Parent exists
if (HasParent)
{
// create a message to send
Message message = new Message();
// Set the text
message.Text = loginResponse.Message;
// Send a message to the parent
Parent.ReceiveData(message);;
}
Я просто передаю текст выше, но есть также коллекция NamedParameters, которую вы можете передать любой тип данных (объект).
Здесь есть полный рабочий пример и учебное пособие, если вы заинтересованы:
Код https://github.com/DataJuggler/BlazorImageGallery
Видео https://youtu.be/3xKXJQ4qThQ