.NET Maui中如何通过代码修改Label的Text属性并解决上下文错误?
问题描述
我在MainPage.xaml中定义了如下Label控件:
<Label x:Name="Ans" Text="" FontSize="18" FontFamily="Verdana" FontAttributes="Bold" TextColor="White" Grid.Column="1" Grid.Row="2" Padding="20,20,0,0"/>
我想在运行时修改这个Label的Text属性,于是在自定义类里写了以下代码:
string retVal; retVal = "This is a test"; Ans.Text = retVal;
但收到错误提示:
"The name 'Ans' does not exist in the current context."
请问该如何解决?
解决方法
1. 让自定义类获取MainPage实例并修改控件
Ans是MainPage页面内的控件,默认仅在MainPage的后台代码(MainPage.xaml.cs)中可直接访问。如果自定义类和MainPage分离,需要先获取MainPage的实例,同时调整控件的访问权限:
- 先修改MainPage中
Ans的访问修饰符:可以在XAML里直接添加x:FieldModifier="public",或者在MainPage.xaml.cs中把自动生成的控件声明改为public:
<Label x:Name="Ans" x:FieldModifier="public" .../>
- 然后在自定义类中通过当前应用的主页面实例访问控件:
var mainPage = Application.Current.MainPage as MainPage; if (mainPage != null) { string retVal = "This is a test"; mainPage.Ans.Text = retVal; }
2. 使用MVVM数据绑定(推荐方案)
直接在外部类操作UI控件不符合Xamarin.Forms的设计规范,更优雅的方式是通过数据绑定实现:
- 第一步:创建ViewModel类,实现
INotifyPropertyChanged接口来通知UI更新:
public class MainViewModel : INotifyPropertyChanged { private string _ansText; public string AnsText { get => _ansText; set { _ansText = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
- 第二步:在MainPage.xaml中把Label的
Text属性绑定到ViewModel的AnsText:
<Label x:Name="Ans" Text="{Binding AnsText}" .../>
- 第三步:在MainPage.xaml.cs中设置BindingContext:
public MainPage() { InitializeComponent(); BindingContext = new MainViewModel(); }
- 第四步:在自定义类中修改ViewModel的属性即可自动更新UI:
var mainViewModel = (MainViewModel)Application.Current.MainPage.BindingContext; mainViewModel.AnsText = "This is a test";
3. 若自定义类是MainPage的嵌套类
如果自定义类是MainPage.xaml.cs中的嵌套类,可直接通过MainPage实例访问控件:
public class MainPage : ContentPage { public class CustomClass { public void UpdateLabel(MainPage page) { page.Ans.Text = "This is a test"; } } }
内容的提问来源于stack exchange,提问作者user21591607
相关产品推荐
相关产品推荐

