有没有办法有条件地确定 Blazor 中的组件绑定到什么?

问题描述 投票:0回答:1

对于背景,对于我的每个表单,它们绑定到两个对象之一:InsertParameters 或 UpdateParameters,具体取决于您是进行插入还是更新。插入和更新的表单是相同的,所以我希望它们能够处理这两者。我需要实现双向绑定。

我不想复制组件来更新和插入。

我希望能够做这样的事情,检查组件绑定要绑定的内容:

<InputDate @bind-Value=@(updateParams is not null ? updateParams.Date : insertParams.Date) />

目前,我可以通过以下方式实现这一目标:

<InputDate Value=@(updateParams is not null ? updateParams.Date : insertParams.Date)
           ValueChanged=@((x) => HandleValueChanged(x, nameof(CaseActivity.Date)) />

处理值更改:

private void HandleValueChanged(object? value, string propertyName)
{
    if (value == null) return;

    if (updateParams != null)
    {
        PropertySetter.SetPropertyValue(updateParams, propertyName, value);
    }
    else
    {
        PropertySetter.SetPropertyValue(insertParams!, propertyName, value);
    }
}

属性设置者:

public static void SetPropertyValue<T>(T obj, string propertyName, object? value)
{
    if (obj == null)
    {
        throw new ArgumentNullException(nameof(obj));
    }

    if (propertyName == null)
    {
        throw new ArgumentNullException(nameof(propertyName));
    }

    Type objectType = typeof(T);
    PropertyInfo? property = objectType.GetProperty(propertyName);

    if (property == null)
    {
        throw new ArgumentException($"Property '{propertyName}' not found on type '{objectType.FullName}'.");
    }

    if (!property.CanWrite)
    {
        throw new ArgumentException($"Property '{propertyName}' on type '{objectType.FullName}' does not have a public setter.");
    }

    property.SetValue(obj, value);
}

虽然这有效,但我只是觉得必须有一种更好的方法来实现这一点,而且更内置,但我的搜索尚未取得任何成功。

非常感谢任何帮助。

data-binding blazor
1个回答
0
投票

当您可以控制参数 tpes 时:

interface IHaveDate { DateTime Date { get; set; } }

class InsertParams : IHaveDate { ... }
class UpdateParams : IHaveDate { ... }

然后像这样使用它

<InputDate @bind-Value="@(updateParams as IHaveDate ?? insertParams).Date" />
© www.soinside.com 2019 - 2024. All rights reserved.