单向[参数]程序绑定



我想为第三方组件的参数设置默认值。假设我有这个:

myBasePage.cs:

public class MyBasePage : ComponentBase
{
public IEnumerable MyData { get; set; }
}

myPage.razor:

@inherits MyBasePage
<ThirdPartyComponent Data="@MyData" />

由于ThirdPartyComponent上的Data是一个具有DataHasChanged()虚拟方法的[Parameter],因此通过这样渲染blazor组件,我将获得单向绑定,如果我在页面上以编程方式更改MyData,组件将更新这会很好用的

现在,假设我不能修改ThirdPartyComponent,但我想根据我的基本页面在其中设置一些默认值。。。像这样:

myPage.razor:

@inherits MyBasePage
<MyDerivedComponent PageComponent="@this" />

myDerivedComponent.cs:

public class MyDerivedComponent : ThirdPartyComponent 
{
[Parameter] public MyBasePage PageComponent { get; set; }
public override void OnInitialized()
{
/* Set other parameter defaults */
this.OtherParameter = 10;
/* Bind to Data, as if I was passing it as a parameter in the Razor template */
this.Data = PageComponent.MyData;
}
}

此行:

this.Data = PageComponent.MyData;

根本不创建绑定(如果我修改MyData,blazor组件就不会更新(。有什么方法可以通过编程方式创建它吗?

注意:真正的ThirdPartyComponent不仅包括大量的参数,还包括模板等。出于多种原因,我希望MyDerivedComponent是派生类型,而不是";父组件";有一个ThirdPartyComponent的孩子(如果可能的话(。

这应该有效:

public class MyDerivedComponent : ThirdPartyComponent 
{
[Parameter] public MyBasePage PageComponent { get; set; }
public override void OnInitialized()
{
/* Set other parameter defaults */
this.OtherParameter = 10;

//this.Data = PageComponent.MyData;
}
}
protected override void OnParametersSet()   
{
Data = Data ?? PageComponent?.MyData ;  // determine priority
base.OnParametersSet();
}

CCD_ 11通知组件它具有新的参数。最派生的类可以在此处进行干预。

但当this.MyData发生变化时,没有简单的解决方案,这对Blazor来说是看不到的。

有什么方法可以通过编程方式创建它吗当然,但这并不意味着你应该。

不应在组件代码中设置或操作参数。每当Renderer调用SetParametersAsync时,都会从外部设置参数。如果你在内部改变它们,你就会创造出两个版本的真相。

最新更新