在 .NET MAUI 中实现简单 .NET MAUI 页面继承时出现错误

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

我遇到了 .NET Maui 问题。我一整天都在努力:我正在创建我的第一个应用程序,一个简单的家庭维护跟踪应用程序。我有 4 个非常相似的屏幕,因此我决定实现一个页面类,以便这些相似的页面可以继承父页面或基页面的特征。我设置了一个页面,

NewBasePage
,5 个页面将继承该页面。我创建了其中一个页面,即
PartsBuyDetail
页面来进行测试。我无法编译它。

我必须做什么才能让

PartsBuyDetail
页面继承
NewBasePage

这是我的

NewBasePage
XAML 标记:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="HomeUpKeepPro.Views.NewBasePage">

    <StackLayout Padding="10">
        <Label FontSize="24" HorizontalOptions="Center" x:Name="TitleLabel" />
        <Label FontSize="18" HorizontalOptions="Center" x:Name="TaskTitleLabel" />
        <CollectionView x:Name="ItemsCollectionView">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Orientation="Horizontal" Padding="5">
                        <Label Text="{Binding SourceName}" FontSize="16" />
                        <Label Text="{Binding SourceURL}" FontSize="16"                
                                                              TextColor="Blue" />
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
        <Label x:Name="DetailLabel" />
        <Button Text="Add" Clicked="OnAddClicked" />
        <Button Text="Save" Clicked="OnSaveClicked" />
        <Button Text="Delete" Clicked="OnDeleteClicked" />
    </StackLayout>
</ContentPage>

这是我的

NewBasePage.xaml.cs
代码:

using Microsoft.Maui.Controls;

namespace HomeUpKeepPro.Views
{
    public partial class NewBasePage : ContentPage
    {
        public NewBasePage()
        {
            InitializeComponent();
        }
        
        protected void OnAddClicked(object sender, EventArgs e)
        {
            // Handle the Add button click event 
        }

        protected void OnSaveClicked(object sender, EventArgs e)
        {
            // Handle the Save button click event
        }

        protected void OnDeleteClicked(object sender, EventArgs e)
        {
            // Handle the Delete button click event
        }
    }
}

注意:当我添加时:

protected Label TitleLabel { get; private set; }
protected Label TaskTitleLabel { get; private set; }
protected CollectionView ItemsCollectionView { get; private set; }
protected Label DetailLabel { get; private set; }

public NewBasePage()
行上方,发生了 36 个错误,本质上是说类型
NewBasePage
已经包含标签和 CollectionView 的定义以及
NewBasePage.TitleLabel
NewBasePage.TitleLabel
之间的歧义。

这是我的

PartsBuyDetail.xaml
标记(对于要从
NewBasePage
继承的页面):

<?xml version="1.0" encoding="utf-8" ?>
<views:NewBasePage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                xmlns:views="clr-namespace:HomeUpKeepPro.Views"
                x:Class="HomeUpKeepPro.Views.PartsBuyDetail">

</views:NewBasePage>

这最后是我的

PartsBuyDetail.xaml.cs
代码(用于从
NewBasePage
继承的页面):

using Microsoft.Maui.Controls;
using System.Collections.ObjectModel;
using HomeUpKeepPro.Models;

namespace HomeUpKeepPro.Views
{
    public partial class PartsBuyDetail : NewBasePage
    {
        public PartsBuyDetail()
        {
            InitializeComponent();

            // Populate data in code-behind
            TitleLabel.Text = "Parts Buy Detail";
            TaskTitleLabel.Text = "Task: Buy Parts";

            var parts = new ObservableCollection<PartsBuy>
            {
                new PartsBuy { SourceName = "Home Depot", SourceURL = "www.homedepot.com" },
                new PartsBuy { SourceName = "Lowes", SourceURL = "www.lowes.com" }
            };
            ItemsCollectionView.ItemsSource = parts;

            DetailLabel.Text = "Details about buying parts.";
        }
    }
}

这些是我遇到的错误:

CS0122“NewBasePage.TitleLabel”由于其保护级别 PartsBuyDetail.Xaml.cs 13 而无法访问
CS0122“NewBasePage.TaskTitleLabel”由于其保护级别 PartsBuyDetail.Xaml.cs 14
而无法访问 CS0122“.ItemsCollectionView”由于其保护级别 PartsBuyDetail.Xaml.cs 20
而无法访问 CS0122“NewBasePage.DetailLabel”由于其保护级别 PartsBuyDetail.Xaml.cs 21

而无法访问
c# inheritance maui
1个回答
0
投票

关于命名控件是“私有字段”的评论是正确的。 这是我解决这个问题的方法。

在 NewBasePage.xaml 中,对于每个命名项(TitleLabel、TaskTitleLabel、ItemsCollectionView 和 DetailLabel),添加

x:FieldModifier="protected"
© www.soinside.com 2019 - 2024. All rights reserved.