Xamarin.Forms中CS文件无法访问XAML命名元素报错如何解决
问题原因
- 核心原因:你声明了
x:Name="stackY"、x:Name="grid1"、x:Name="mylabel"的控件都位于ListView的DataTemplate模板内,DataTemplate是列表每一行的复用模板,运行时会根据数据源条数生成多套对应控件,不会在页面类的后台代码中生成全局引用,所以直接访问会提示不存在。 - 额外注意:你报错信息里的变量名是
mylable,而XAML里声明的是mylabel,先确认是不是拼写错误导致的问题。
解决方案
方案1:采用MVVM绑定(推荐)
这是最符合Xamarin.Forms开发规范的方案,避免直接操作控件:
- 给你的
Product实体类添加需要绑定的属性,比如要修改Label的文本,就添加LabelContent属性,同时实现INotifyPropertyChanged接口。 - 修改XAML中Label的绑定:
<Label x:Name="mylabel" Text="{Binding LabelContent}" TextColor="White" HorizontalTextAlignment="Center" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" FontSize="Large"/>
- 要修改文本时,直接修改对应
Product实例的LabelContent属性即可,UI会自动更新。
示例代码:
void showit(Product targetProduct) { targetProduct.LabelContent = "xxxxxxx"; }
方案2:主动查找当前行的控件实例
如果你确实需要直接访问控件,可以在列表交互事件中查找对应行的控件:
以ItemTapped事件为例,获取当前点击行的mylabel控件代码如下:
private void ListViewItem_Tabbed(object sender, ItemTappedEventArgs e) { // 获取当前点击行的ViewCell var cell = list1.TemplatedItems.GetItem(e.ItemIndex) as ViewCell; // 查找当前行内的Label控件 var mylabel = cell.FindByName<Label>("mylabel"); if(mylabel != null) { mylabel.Text = "xxxxxxx"; } // 原有逻辑 var product = e.Item as Product; var vm = BindingContext as MainListView; vm?.ShoworHiddenProducts(product); }
注意:该方案要注意ListView的虚拟化复用机制,直接修改控件属性会在列表滚动后出现显示错乱,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者ivbtar
相关产品推荐
相关产品推荐

