为什么它不记得在Xamarin中输入的最后一个文本?

时间:2019-06-22 08:09:00

标签: xamarin xamarin.forms

我想记住最后输入的内容,然后将其输出到Label上以检查其是否有效。我正在使用Montemagno的Xam.Plugins.settings。

我尝试了设置。

using Plugin.Settings;
using Plugin.Settings.Abstractions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace App424
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
// by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public static string LastPickName
{
    get => AppSettings.GetValueOrDefault(nameof(LastPickName), string.Empty);
    set => AppSettings.AddOrUpdateValue(nameof(LastPickName), value);
}

string name;
public MainPage()
{
    InitializeComponent();


/*works if i force a text
nameEntry.Text = "You";
LastPickName = nameEntry.Text;

nameLabel.Text = LastPickName;*/

name = nameEntry.Text;
LastPickName = name

nameLabel.Text = LastPickName;
}


}
}

标签为空。它没有显示应该保存的数据。

3 个答案:

答案 0 :(得分:1)

由于Label组件不受该变量的限制,因此仅在您再做nameEntry.Text = "You"; e时它才会获得其值。

要使其正常工作,您基本上有两种选择:

1。在每次更改时将值设置为标签;

只需设置值或变量,如Argon在其答案中建议的

2。将页面(视图)绑定到可观察对象,然后视图将侦听可观察对象(通常是视图模型)上的每处更改并对此做出反应(例如,更改其自身Text值)。

我想您打算做的是第二个。因此,您可以在页面代码后面创建一个公共字符串full属性,并将页面实例绑定到自身。像这样:

   <Label Text="{Binding MyStringProperty}"
  .../>

和绑定:

 private string myStringProperty;
    public string MyStringProperty
    {
        get { return myStringProperty; }
        set 
        {
            myStringProperty = value;
            OnPropertyChanged(nameof(MyStringProperty)); // Notify that there was a change on this property
        }
    }

如果这对您仍然没有意义/不可行,我建议您花一些时间来掌握Data Binding,这不会花很长时间,而且在Xamarin Forms中至关重要。 或者,在数据绑定上观看James's video

答案 1 :(得分:0)

使用一种方法将值设置为设置。

<Entry Placeholder="Name" x:Name="name" Unfocused="Handle_Unfocused"/>
void Handle_Unfocused(object sender, Xamarin.Forms.FocusEventArgs e)
{
  LastPickName = name.Text;
}

答案 2 :(得分:0)

使用“属性”字典存储简单值,然后使用Unfocused事件从Entry获取最后一个文本,请注意Entry.Text为null或在未聚焦时为空。

 <StackLayout>
        <Entry x:Name="entry1" Unfocused="Entry1_Unfocused" />
        <Label
            x:Name="label1"
            HorizontalOptions="CenterAndExpand"
            VerticalOptions="CenterAndExpand" />
    </StackLayout>


 private void Entry1_Unfocused(object sender, FocusEventArgs e)
    {
        if(!string.IsNullOrEmpty(entry1.Text))
        {
            Application.Current.Properties["myTextValue"] = entry1.Text;
            label1.Text = Application.Current.Properties["myTextValue"].ToString();
        }
    }

enter image description here