我对Xamarin表格比较陌生。我发现我无法从后面的代码中更改标签文本。通常我会做myLabel.text = variable
。这在Xamarin中有效吗?如果可以,为什么此代码不更改文本?
Label_ControlSW.Text = controlSW_Out;
Label_BLESW.Text = bleSW_Out;
Label_Mode.Text = mode_Out;
Xaml文件
<Label x:Name="Label_ControlSW" Grid.Row="1" Grid.Column="1" HorizontalOptions="Center" VerticalOptions="Center" FontSize="17" TextColor="White"/>
<Label x:Name="Label_BLESW" Grid.Row="2" Grid.Column="1" HorizontalOptions="Center" VerticalOptions="Center" FontSize="17" TextColor="#525252"/>
<Label x:Name="Label_Mode" Grid.Row="4" Grid.Column="1" HorizontalOptions="Center" VerticalOptions="Center" FontSize="17" TextColor="White"/>
答案 0 :(得分:3)
请尝试在XAML中初始化csr
值,如下所示:
routes.map(route => route.subroutes).map(subroute => 'do whatever you want with each subroute')
然后像下面这样在后面的代码中对其进行访问:
Text
或
<Label x:Name="YourLableName" Text="Initial Label"/>
答案 1 :(得分:2)
这在Xamarin中起作用吗?
是的。
如果可以,为什么此代码不更改文本?
由于Label
组件不受该变量的限制,因此仅在执行Label_ControlSW.Text = controlSW_Out;
后再获取其值。
要使其正常工作,您基本上有两种选择:
1。在每次更改时将值设置为标签;
这里没有魔术。只需设置值或变量,例如Ali Heikal suggests in his answer
2。将页面(视图)绑定到可观察对象,然后视图将侦听可观察对象(通常是视图模型)上的每处更改并对此做出反应(例如,更改其自身Text值)。>
我想您打算做的是第二个。因此,您可以在页面代码后面创建一个公共字符串full属性,并将页面实例绑定到自身。像这样:
XAML
<Label Text="{Binding MyStringProperty}"
.../>
背后的代码
public partial class MyTestPage : ContentPage
{
private string myStringProperty;
public string MyStringProperty
{
get { return myStringProperty; }
set
{
myStringProperty = value;
OnPropertyChanged(nameof(MyStringProperty)); // Notify that there was a change on this property
}
}
public MyTestPage()
{
InitializeComponents();
BindingContext = this;
MyStringProperty = "New label text"; // It will be shown at your label
}
}
您应该看一下official docs about data bindings and MVVM pattern on XF,如果您是从Xamarin.Forms开始的,我强烈建议您遵循official getting started guide来处理每个主题,这些主题应该足够清晰,深入,以学习您所需的一切。
希望对您有帮助。
答案 2 :(得分:0)
我遇到了同样的问题。在视图文件夹中创建x:Name引用后,尝试清理并构建项目。或者,您可以执行数据 绑定。通过使用此代码
<Label Text="{Binding MyProperty}" />
在 Xaml 中。在 ViewModel 类
中public class MyViewModel
{
public string MyProperty { get; set; } = "My Label Text";
}
在后面的代码中,只需提及您使用的 ViewModel
this.BindingContext = new MyViewModel();
这是正确的方法。因此,在以后的编码中尝试使用 MVVM 方法,因为这是正确的方法。
答案 3 :(得分:0)
为了更新UI,您必须位于UI线程上。您可能想要做类似的事情:
Device.BeginInvokeOnMainThread(() =>
{
Label_ControlSW.Text = controlSW_Out;
Label_BLESW.Text = bleSW_Out;
Label_Mode.Text = mode_Out;
});
这将解决您的问题,但是正如其他人在回答中所述,Xamarin的实现方式将使用data binding来更新视图。数据绑定将为您处理UI更新。
答案 4 :(得分:0)
有几个原因导致它不起作用。我改为使用MVVM方法。这仍然没有效果,但是它是建议的更好方法。调试时,我注意到以下行:I / Choreographer(16942):跳过了31帧!该应用程序可能在其主线程上做太多工作。这是因为我在主线程上做得太多(连接错误),而只是跳过了UI更改。我必须重组代码以在不同线程上执行更多操作。谢谢大家的帮助。