Xamarin Can';调用BasePage类上的InitializeComponent后,无法访问XAML元素

Xamarin Can';调用BasePage类上的InitializeComponent后,无法访问XAML元素,xamarin,xamarin.forms,Xamarin,Xamarin.forms,编辑:以下是一些代码落后及其报告内容的要点: 注意:问题只针对InitializeComponent调用中发生的事情,而不是其他很多事情。请把问题通读一遍 我有一个MyPage->BasePage->ContentPage结构。如果BasePage执行InitializeComponent()则XAML元素在MyPage中失去作用域。。这意味着我无法调用MyPage.MyListView.ItemSource=xyz而不获得NullReferenceException 如果InitializeC

编辑:以下是一些代码落后及其报告内容的要点:

注意:问题只针对InitializeComponent调用中发生的事情,而不是其他很多事情。请把问题通读一遍

我有一个
MyPage->BasePage->ContentPage
结构。如果
BasePage
执行
InitializeComponent()
则XAML元素在
MyPage
中失去作用域。。这意味着我无法调用
MyPage.MyListView.ItemSource=xyz
而不获得NullReferenceException

如果
InitializeComponent()
调用只发生在
MyPage
中,则一切正常(意味着它不会在
BasePage
中被调用)

这个问题非常具体,是关于理解为什么调用
BasePage.InitializeComponent()
会中断对XAML元素的引用,如
x:MyListView

   Models
   Pages
     ├ BasePage.xaml
     |   ⤷ BasePage.xaml.cs
     └ MyPage.xaml
         ⤷ MyPage.xaml.cs
   Views
   App.xaml
     ⤷ App.xaml.cs
在我的
MyPage.xaml
标记中,我有各种StackLayout元素、ListView等。它们都存在于
pages:BasePage.Content
标记中,如下所示:

<!-- for s/o: MyPage.xaml -->
<?xml version="1.0" encoding="utf-8" ?>
<pages:BasePage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:pages="clr-namespace:Namespace.Pages"
    xmlns:views="clr-namespace:Namespace.Views"
    x:Class="Namespace.Pages.MyPage">

    <pages:BasePage.Content>

        <ListView x:Name="ListViewView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Image Source="{Binding imageUrl}" />
                            <Label Text="{Binding formattedDayOfWeek}" />
                            <Label Text="{Binding formattedDate}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </pages:BasePage.Content>

</pages:BasePage>

因此,我重申:

MyPage.xaml.cs
中,我试图在从REST服务器异步获取后调用
ListViewView.ItemsSource=SomeDataModel

如果扩展的
BasePage.xaml.cs
类在其构造函数中调用
InitializeComponent()
。。。设置ItemsSource时,我将获得一个NullReferenceException

如果扩展的
BasePage.xaml.cs
类未在其构造函数中调用
InitializeComponent()
。。。ItemsSource已正确设置并显示列表

有人能解释一下为什么父
InitializeComponent
调用会导致
MyPage
类中的null引用吗


谢谢

首先,我认为你说的是真的(我自己没有试过)


如果是这种情况,这是因为XAML不能像C#类那样继承。因此,通过嵌入XAML页面,您只继承了它的C#代码,而不是它的XAML内容。记住这一点,
InitializeComponent
不应该起作用。

首先,我假设你说的是真的(我自己没有试过)


如果是这种情况,这是因为XAML不能像C#类那样继承。因此,通过嵌入XAML页面,您只继承了它的C#代码,而不是它的XAML内容。记住这一点,
InitializeComponent
不应该工作。

默认情况下,Xamarin从XAML生成的变量是
私有的
,因此您不能在继承的类中访问它们

允许您更改默认行为

<Label x:Name="publicLabel" x:FieldModifier="public" />

默认情况下,Xamarin从XAML生成的变量是
私有的
,因此您不能在继承的类中访问它们

允许您更改默认行为

<Label x:Name="publicLabel" x:FieldModifier="public" />


如果你有一个,我会尝试为你复制它如果你有一个,我会尝试为你复制它我没有说它不可复制,我说如果他提供了MCVERight,我会尝试复制,@Jason说他无法尝试,因为我没有提供完整的示例。。但除此之外,我想我理解您的意思,即我可以扩展/继承整个代码,但不能扩展XAML本身。所以如果我希望我的顶级类具有函数和动态“ItemsSource”绑定。。我希望扩展类具有相同的功能(但在其自身的XAML中),然后我必须将XAML复制到顶级类中,以便利用扩展的代码隐藏?@MattKenefick是的,我会这么说。要补充我之前的内容:难道没有扩展XAML+CodeBehind的方法吗,这样我就可以让父类分别实例化和与这两个XAML交互了?喜欢如果我的BasePage.xaml有一个列表视图,并且我希望在BasePage.xaml.cs中处理它。但是我有一个MyPage.xaml,它也有类似于ListView的东西,我想把它分开,但在它自己的MyPage.xaml.cs中进行扩展。那不可能吗?还是我只需要重新思考我的结构?@MattKenefick我不知道这是可以做到的。因此,如果有人有其他意见,可能只能等待,当然。我没有说这是不可复制的,我说如果他提供MCVERight,我会尝试复制,@Jason说他不能尝试,因为我没有提供完整的示例。。但除此之外,我想我理解您的意思,即我可以扩展/继承整个代码,但不能扩展XAML本身。所以如果我希望我的顶级类具有函数和动态“ItemsSource”绑定。。我希望扩展类具有相同的功能(但在其自身的XAML中),然后我必须将XAML复制到顶级类中,以便利用扩展的代码隐藏?@MattKenefick是的,我会这么说。要补充我之前的内容:难道没有扩展XAML+CodeBehind的方法吗,这样我就可以让父类分别实例化和与这两个XAML交互了?喜欢如果我的BasePage.xaml有一个列表视图,并且我希望在BasePage.xaml.cs中处理它。但是我有一个MyPage.xaml,它也有类似于ListView的东西,我想把它分开,但在它自己的MyPage.xaml.cs中进行扩展。那不可能吗?还是我只需要重新思考我的结构?@MattKenefick我不知道这是可以做到的。所以,如果有人有其他的意见,可能就只能等待了,当然。我想可能是这样,但似乎不起作用。这里有一些关于发生的事情的要点:我不希望显式FindByName与继承的XAML页面一起工作,但是,如果您适当地设置字段修饰符,我希望自动生成的类型是可用的。如果这真的很重要,您可能应该在XF Github上创建一个问题,并让团队响应。我认为可能是这样,但它似乎不起作用。这里有一点关于发生的事情的要点:我不会