我认为接口是实现这一目标的最佳方式。
这来自我的Nuget包,DataJugger.Blazor.Components
接口IBlazorComponent:
#region using statements
using System.Collections.Generic;
#endregion
namespace DataJuggler.Blazor.Components.Interfaces
{
#region interface IBlazorComponent
public interface IBlazorComponent
{
#region Methods
#region ReceiveData(Message message)
void ReceiveData(Message message);
#endregion
#endregion
#region Properties
#region Name
public string Name { get; set; }
#endregion
#region Parent
public IBlazorComponentParent Parent { get; set; }
#endregion
#endregion
}
#endregion
}
IBlazorComponentParent接口
#region using statements
using System.Collections.Generic;
#endregion
namespace DataJuggler.Blazor.Components.Interfaces
{
#region interface IBlazorComponentParent
public interface IBlazorComponentParent
{
#region Methods
#region FindChildByName(string name)
IBlazorComponent FindChildByName(string name);
#endregion
#region ReceiveData(Message message)
void ReceiveData(Message message);
#endregion
#region Refresh()
void Refresh();
#endregion
#region Register(IBlazorComponent component)
void Register(IBlazorComponent component);
#endregion
#endregion
#region Properties
#region Children
public List<IBlazorComponent> Children { get; set; }
#endregion
#endregion
}
#endregion
}
关于使用,以下是最相关的部分:
在您的组件中,它是一个IBlazorCompoent(子级),其中有一个Parent属性。
在您的组件中,您可以像这样设置父级:
<Login Parent=this></Login>
然后在你的组件中,你可以像这样修改父级属性:
[Parameter]
public IBlazorComponentParent Parent
{
get { return parent; }
set
{
parent = value;
(Parent != null)
{
Parent.Register(this);
}
}
}
接下来,在实现了 IBlazorComponentParent 接口的父组件中,添加一个用于存储你的组件的属性,并将 Register 方法改为以下代码:
public Login LoginComponent { get; set; }
public void Register(IBlazorComponent component)
{
if (component is Login)
{
LoginComponent = component as Login;
}
else if (component is Join)
{
SignUpComponent = component as Join;
}
}
此时,我的登录组件知道其父组件,而其父组件也知道登录组件,因此我可以这样发送消息:
从子组件中,发送一个简单的消息:
if (Parent != null)
{
Message message = new Message();
message.Text = "Some message";
Parent.SendMessage(message);
}
或者发送一个复杂的消息
// create a message
DataJuggler.Blazor.Components.Message message = new DataJuggler.Blazor.Components.Message()
// Create the parameters to pass to the component
NamedParameter parameter = new NamedParameter()
// Set the name
parameter.Name = "PixelInformation Update"
parameter.Value = pixel
// Create a new collection of 'NamedParameter' objects.
message.Parameters = new List<NamedParameter>()
// Add this parameter
message.Parameters.Add(parameter)
// Send this to the component
ColorPickerComponent.ReceiveData(message)
然后在父级中接收消息:
public void ReceiveData(Message message)
{
if ((message != null) && (message.HasParameters))
{
if (message.Parameters[0].Name == "PixelInformation Update")
{
SelectedPixel = (PixelInformation) message.Parameters[0].Value;
SetupColorPicker();
}
}
}
上述代码用于我的最新网站PixelDatabase.Net https://pixeldatabase.net
如果有人需要,Nuget包的代码都是开源的:
DataJuggler.Blazor.Components
https://github.com/DataJuggler/DataJuggler.Blazor.Components
我来自Windows Forms背景,所以我喜欢能够像这样在组件之间进行通信,而数据绑定并不总是有效。
this.Login.DoSomething(data)
你也可以像这样将父类转换为特定类型:
public IndexPage ParentIndexPage
{
get
{
// cast the Parent object as an Index page
return this.Parent as IndexPage;
}
}
因此,如果父级存在,您的子级可以调用父级的方法或设置属性,因此始终要添加:
public bool HasParentIndexPage
{
get
{
return (ParentIndexPage != null);
}
}
因此,为了方便子级使用:
if (HasParentIndexPage)
{
ParentIndexPage.SomeMethod();
}