c# - '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();
}
}
我做错了什么?你能帮助我吗?
解决方案
直接错误是代码隐藏的基类与 razor-in-front 类不同。
您可以将此行添加到ToDoTest.razor
:
@inherits MyPage<IToDoViewModel>
然后它将编译。
另一个问题
VModel.PropertyChanged -= OnPropertyChangedHandler;
此取消订阅仅在您使用 OnInitialized 订阅时有效
VModel.PropertyChanged += OnPropertyChangedHandler;
但我不认为 WPF 设计模式的这种字面移植在 Blazor 中会很好地工作。您将为每个 PropertyChanged() 获得一个(昂贵的)渲染。请注意,您不(不能)使用 propertyName。
推荐阅读
- ios - XCUITest - 打开 iOS 设置并更改日期/时间
- r - 为什么 gsub/sub 不能代替“..”?
- c++ - 为什么我的派生类显示为抽象类?
- azure - 尝试为 azurerm 后端创建存储容器失败,出现 404 - 指定的资源不存在
- r - 在 R 中设置因子的颜色
- javascript - 从 c++ 到 java 脚本的用户控制 Webassembly 访问调用
- python - 如何在 numpy 中声明类似于此 C 结构的结构化数组类型?
- python - Pygame - 让精灵循环浏览类中的图像,并分配一个命中框
- sql - 如何在firebird函数datediff中获得正确的年月日,包括闰年
- sql - 如果组为空,则从查询中删除结果