Xamarin Can';调用BasePage类上的InitializeComponent后,无法访问XAML元素
编辑:以下是一些代码落后及其报告内容的要点: 注意:问题只针对InitializeComponent调用中发生的事情,而不是其他很多事情。请把问题通读一遍 我有一个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
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上创建一个问题,并让团队响应。我认为可能是这样,但它似乎不起作用。这里有一点关于发生的事情的要点:我不会