问题描述
我在 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 (将#修改为@)