以编程方式进行单向 [Parameter] 绑定

One-way [Parameter] binding programatically

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

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();
 }

OnParametersSet() 通知组件它有新的参数。派生最多的class这里可以介入

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

有没有办法以编程方式创建它?当然可以,但这并不意味着您应该这样做。

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