让MAUI页面继承表单自定义基类

Posted

技术标签:

【中文标题】让MAUI页面继承表单自定义基类【英文标题】:Let MAUI page inherit form custom base class 【发布时间】:2021-11-26 18:54:46 【问题描述】:

我希望我的页面类继承自以下基类:

public abstract class BaseContentPage<T> : ContentPage where T : BaseViewModel

    public BaseContentPage(T viewModel, string pageTitle)
    
        BindingContext = ViewModel = viewModel;
        Title = pageTitle;
    

    protected T ViewModel  get; 


public partial class MainPage : BaseContentPage<MainVm>

    public MainPage(MainVm vm) : base(vm, "Hello")
    
        InitializeComponent();
    

页面类是部分的,我想,MAUI 会生成一些具有不同父类的隐藏代码。然后我收到以下错误:

CS0263:“类型”的部分声明不得指定不同的基类

有没有办法指定生成的部分类的父类?

编辑

首先,我保留了原始标记,它会生成不同的基类并导致 CS0263 错误:

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:m="clr-namespace:MyProject.Models"
        xmlns:vm="clr-namespace:MyProject.ViewModels"
        x:Class="MyProject.Pages.MainPage"
        xmlns:local="clr-namespace:MyProject">
        <BaseContentPage.Content>
            <StackLayout>
                <Label Text="Welcome to MyProject!"
                    VerticalOptions="CenterAndExpand" 
                    HorizontalOptions="CenterAndExpand" />
            </StackLayout>
        </BaseContentPage.Content>
    </ContentPage>
然后我尝试将我的通用基类与 @JuanSturla 提到的 TypeArguments 一起使用,但这会导致未知类错误:

    <BaseContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:m="clr-namespace:MyProject.Models"
        xmlns:vm="clr-namespace:MyProject.ViewModels"
        x:Class="MyProject.Pages.MainPage"
        x:TypeArguments="vm:MainVm"
        xmlns:local="clr-namespace:MyProject">
        <BaseContentPage.Content>
            <StackLayout>
                <Label Text="Welcome to MyProject!"
                    VerticalOptions="CenterAndExpand" 
                    HorizontalOptions="CenterAndExpand" />
            </StackLayout>
        </BaseContentPage.Content>
    </BaseContentPage>

【问题讨论】:

您是否还更改了 XAML 上的基类?他们应该匹配 @JuanSturla 如何为BaseContentPage 标记指定通用值? 我不知道。 MVVMCross 做了类似的事情。在代码隐藏中它类似于 MyPage: MvxContentPage&lt;ViewModel&gt; 而在 XAML 中它是 &lt;views:MvxContentPage xmlns:viewModels="clr-namespace:MyMvvmCrossApp1.Core.ViewModels.Contacts;assembly=MyMvvmCrossApp1.Core" x:TypeArguments="viewModels:ContactsViewModel"&gt; 您可以在下面的链接中提出您的 MAUI 问题以获得更多支持。 github.com/dotnet/maui/issues 如果在 XAML 中将 BaseContentPage 替换为 local:BaseContentPage 【参考方案1】:

根据胡安的建议,这里是正确的语法:

    <local:BaseContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:m="clr-namespace:MyProject.Models"
        xmlns:vm="clr-namespace:MyProject.ViewModels"
        x:Class="MyProject.Pages.MainPage"
        x:TypeArguments="vm:MainVm"
        xmlns:local="clr-namespace:MyProject">
        <ContentPage.Content>
            <StackLayout>
                <Label Text="Welcome to MyProject!"
                    VerticalOptions="CenterAndExpand" 
                    HorizontalOptions="CenterAndExpand" />
            </StackLayout>
        </ContentPage.Content>
    </local:BaseContentPage>

x:TypeArguments="vm:MainVm" 定义泛型类型的参数。

【讨论】:

以上是关于让MAUI页面继承表单自定义基类的主要内容,如果未能解决你的问题,请参考以下文章

MAUI自定义 .NET MAUI XAML 页面中的布局

MAUI自定义 .NET MAUI XAML 页面中的布局

Java编程题

.NET Maui 自定义处理程序将参数从 xaml 代码传递到处理程序代码?

在 .NET MAUI 中如何更好地自定义控件

基类 派生类 类的继承与约束