首页 > 解决方案 > 'BuildRenderTree(RenderTreeBuilder)':找不到合适的方法来覆盖

问题描述

我正在尝试在 blazor 中实现一个 MVVM,我发现这里很有趣

我想更进一步,让我的页面从一个抽象类扩展,但我收到了这个错误:

错误 CS0115 'ToDoTest.BuildRenderTree(RenderTreeBuilder)':找不到合适的方法来覆盖 Pages_ToDoTest_razor.g.cs

这是代码,抽象类:

public abstract class MyPage<T> : ComponentBase where T : IToDoViewModel
{
    public abstract T VModel { get; set; }
    protected override async Task OnInitializedAsync()
    {
        VModel.PropertyChanged += async (sender, e) =>
        {
            await InvokeAsync(() =>
            {
                StateHasChanged();
            });
        };
        await base.OnInitializedAsync();
    }

    async void OnPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
    {
        await InvokeAsync(() =>
        {
            StateHasChanged();
        });
    }

    public virtual void Dispose()
    {
        VModel.PropertyChanged -= OnPropertyChangedHandler;
    }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        base.BuildRenderTree(builder);
    }
}

而且,后面的页面代码是:

public partial class ToDoTest : MyPage<IToDoViewModel>
{
    [Inject]
    override public IToDoViewModel VModel { get; set; }

    override public void Dispose()
    {
        base.Dispose();
    }
}

我做错了什么?你能帮助我吗?

标签: c#blazorblazor-server-side

解决方案


直接错误是代码隐藏的基类与 razor-in-front 类不同。

您可以将此行添加到ToDoTest.razor

@inherits MyPage<IToDoViewModel>

然后它将编译。

另一个问题

VModel.PropertyChanged -= OnPropertyChangedHandler;

此取消订阅仅在您使用 OnInitialized 订阅时有效

VModel.PropertyChanged += OnPropertyChangedHandler;

但我不认为 WPF 设计模式的这种字面移植在 Blazor 中会很好地工作。您将为每个 PropertyChanged() 获得一个(昂贵的)渲染。请注意,您不(不能)使用 propertyName。


推荐阅读