如何在同一个应用程序会话中更新 xamarin Essentials 首选项

问题描述

我在 xamarin 中创建了一个设置页面,它可以在应用程序重新启动时很好地更新首选项。这样做的目的是根据首选项保存的布尔值更改应用程序的语言。它在应用程序会话之间运行良好(关闭和重新启动应用程序)。但是,我似乎无法在 SAME 应用程序会话中更新它。例如,您点按开关,所有内容都会立即变为西班牙语,而无需重新启动应用。

Settings.xaml

<ContentPage.BindingContext>
    <vm:Settingsviewmodel />
</ContentPage.BindingContext>

<ContentPage.Resources>
    <ResourceDictionary>
        <Color x:Key="Accent">#74cee2</Color>
    </ResourceDictionary>
</ContentPage.Resources>

<StackLayout>
    <views:Header/>
    <Label Text="Change Lang"/>
    <Switch x:Name="LangSwitch" OnColor="#bbbbbb" ThumbColor="#74cee2" IsToggled="{Binding ChangeLang}" Toggled="LangSwitch_Toggled"/>
</StackLayout>

Settings.xaml.cs(只是为了确保我能够到达开关切换事件)

[XamlCompilation(XamlCompilationoptions.Compile)]
public partial class Settings : ContentPage
{
    public Settings()
    {
        InitializeComponent();
    }

    async void LangSwitch_Toggled(object sender,ToggledEventArgs e)
    {
        await displayAlert("ok","ok","ok");
    }
}

设置视图模型

public class Settingsviewmodel : Baseviewmodel
{
    public Settingsviewmodel()
    {
        Title = "Settings";
    }

    public bool ChangeLang
    {
        get => Preferences.Get("ChangeLang",false);
        set
        {
            Preferences.Set("ChangeLang",value);
            OnPropertyChanged("ChangeLang");
        }
    }
}

Homeviewmodel(ChangeLang bool 用于确定数据)

public class Homeviewmodel : Settingsviewmodel
{
    public Homeviewmodel()
    {
        if (ChangeLang == true)
        {
            Title = "NICU";
            secondaryTitle = "Spanish";
        }
        else
        {
            Title = "NICU";
            secondaryTitle = "English";
        }
    }
}

Baseviewmodel(如果您想知道的话)

public class Baseviewmodel : INotifyPropertyChanged
{
    string title = string.Empty;
    string secTitle = string.Empty;
    public string Title
    {
        get { return title; }
        set { SetProperty(ref title,value); }
    }

    public string secondaryTitle
    {
        get { return secTitle; }
        set { SetProperty(ref secTitle,value); }
    }

    string logo = "logo.png";
    public string logo
    {
        get { return logo; }
    }

    protected bool SetProperty<T>(ref T backingStore,T value,[CallerMemberName] string propertyName = "",Action onChanged = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingStore,value))
            return false;

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this,new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

更新

就像杰森在评论中所说的那样,只需使用消息中心。

public class Homeviewmodel : Settingsviewmodel
{
    public Homeviewmodel()
    {
        setLang();

        MessagingCenter.Subscribe<Baseviewmodel>(this,"lang",(sender) =>
        {
            setLang();
        });
    }

    void setLang()
    {
        if (ChangeLang == true)
        {
            Title = Preferences.Get("ChangeLang",false).ToString();
            secondaryTitle = "Spanish";
        }
        else
        {
            Title = Preferences.Get("ChangeLang",false).ToString();
            secondaryTitle = "English";
        }
    }
}

我将 ChangLang bool 移到我的 Baseviewmodel 中,但这里是更新的。

public bool ChangeLang
    {
        get => Preferences.Get("ChangeLang",value);
            OnPropertyChanged("ChangeLang");
            MessagingCenter.Send(this,"lang");
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)