自定义 Blazor 输入控件包装器组件未正确更新
Custom Blazor Input Control Wrapper Components not updating correctly
我需要一些有关输入控件的 Blazor 实现的帮助。我将 CSLA 与 Telerik Blazor 控件一起使用。
我采用了标准的 Telerik Blazor TelerikTextBox 和 TelerikNumericTextBox 控件,并为这些名为 CslaTextInput 和 CslaNumericInput 的控件创建了我自己的自定义组件包装器。
包装器组件有一个 属性 [参数],它从 BusinessBase 模型中获取 Csla.Blazor.IPropertyInfo。
例如
Property="@(vm.GetPropertyInfo(() => vm.Model.CustomTelerikTextBox))"
然后在包装器中,Telerik 组件根据 Csla.Blazor.IPropertyInfo 值绑定值
例如
@bind-Value="Value"
[Parameter]
public IPropertyInfo Property { get; set; }
protected string Value
{
get => (string)Property.Value;
set => Property.Value = value;
}
因为标准的 Telerik 组件直接处理 属性
例如
@bind-Value="vm.Model.StandardTelerikTextBox"
我相信我面临的问题(不是 100% 确定)是当 Csla.Blazor.IPropertyInfo 的值 属性 发生变化时,Blazor UI 不会收到通知已进行更改,但不会更新屏幕上的绑定模型值。
下面的视频显示了自定义控件的问题,即控件右侧的绑定模型值不会与输入控件值保持同步,直到更改不同的控件并强制在屏幕上进行更新。
如果我在幕后更新模型它会起作用
https://drive.google.com/file/d/1Exfl0U39GU_61vCjieTp5w-TN6yx6rbp/view?usp=sharing
在此代码段中:
@bind-Value="Value"
[Parameter]
public IPropertyInfo Property { get; set; }
protected string Value
{
get => (string)Property.Value;
set => Property.Value = value;
}
您应该添加另一个类型为事件回调的参数,当 Value
属性 的绑定值更改时应调用该参数:
[参数]
public EventCallback PropertyChanged { 得到;放; }
你的 Value
属性 应该是这样的:
protected string Value
{
get => (string)Property.Value;
set
{
if( Property.Value != value}
{
Property.Value = value;
// Notify the parents component that the parameter Property
// property has changed, and that she should consider re-
// rendering
_ = PropertyChanged.InvokeAsync(Property.Value);
}
}
}
警告:不应从子组件更改或修改组件参数属性
我需要一些有关输入控件的 Blazor 实现的帮助。我将 CSLA 与 Telerik Blazor 控件一起使用。
我采用了标准的 Telerik Blazor TelerikTextBox 和 TelerikNumericTextBox 控件,并为这些名为 CslaTextInput 和 CslaNumericInput 的控件创建了我自己的自定义组件包装器。
包装器组件有一个 属性 [参数],它从 BusinessBase 模型中获取 Csla.Blazor.IPropertyInfo。 例如
Property="@(vm.GetPropertyInfo(() => vm.Model.CustomTelerikTextBox))"
然后在包装器中,Telerik 组件根据 Csla.Blazor.IPropertyInfo 值绑定值 例如
@bind-Value="Value"
[Parameter]
public IPropertyInfo Property { get; set; }
protected string Value
{
get => (string)Property.Value;
set => Property.Value = value;
}
因为标准的 Telerik 组件直接处理 属性 例如
@bind-Value="vm.Model.StandardTelerikTextBox"
我相信我面临的问题(不是 100% 确定)是当 Csla.Blazor.IPropertyInfo 的值 属性 发生变化时,Blazor UI 不会收到通知已进行更改,但不会更新屏幕上的绑定模型值。
下面的视频显示了自定义控件的问题,即控件右侧的绑定模型值不会与输入控件值保持同步,直到更改不同的控件并强制在屏幕上进行更新。
如果我在幕后更新模型它会起作用
https://drive.google.com/file/d/1Exfl0U39GU_61vCjieTp5w-TN6yx6rbp/view?usp=sharing
在此代码段中:
@bind-Value="Value"
[Parameter]
public IPropertyInfo Property { get; set; }
protected string Value
{
get => (string)Property.Value;
set => Property.Value = value;
}
您应该添加另一个类型为事件回调的参数,当 Value
属性 的绑定值更改时应调用该参数:
[参数] public EventCallback PropertyChanged { 得到;放; }
你的 Value
属性 应该是这样的:
protected string Value
{
get => (string)Property.Value;
set
{
if( Property.Value != value}
{
Property.Value = value;
// Notify the parents component that the parameter Property
// property has changed, and that she should consider re-
// rendering
_ = PropertyChanged.InvokeAsync(Property.Value);
}
}
}
警告:不应从子组件更改或修改组件参数属性