I have MainLayout.razor with two components: Header.razor and Content.razor. By selecting different menu options content gets changed. With each content changing I need to send content-depended value to the header. I tried different techniques with the same result - the value in the header doesn't get updated. Is there something else I need to do? My code:
Header.razor:
<div>Content Name: @ContentName</div>
@code {
[Parameter]
public string ContentName{ get; set; }
}
Content.razor:
@code{
[CascadingParameter]
MainLayout Parent { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
ContentName = "Content 1";
Parent.SetParameters(ContentName);
}
}
MainLayout.razor:
@inherits LayoutComponentBase
@inject BlazorQART.Data.AppState AState
<div class="sidebar" >
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<Header ContentName="@_ContentName" />
</div>
<div class="content px-4">
<CascadingValue Value="@this">
@Body
</CascadingValue>
</div>
</div>
@code{
private string _ContentName{ get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
AState.OnContentChange = OnContentChanged;
}
public void SetParameters (string content)
{
AState.ChangedContent = content;
}
protected async void OnContentChanged(string content)
{
await InvokeAsync(() =>
{
_ContentName = content;
});
}
AppState.cs:
public class AppState
{
private string _ChangedContent;
public Action<string> OnContentChange { get; set; }
public string ChangedContent
{
get { return _ChangedContent; }
set
{
_ChangedContent= value;
OnContentChange.Invoke(_ChangedContent);
}
}
}