在前一篇文章中,熟悉了视图模型的初始化以及属性和命令的使用。本文将展示如何使用设置服务来保存和检索持久化数据。本文中展示的代码位于示例库中的Sample001。几乎每个应用程序都需要存储和检索设置。Codon提供了一个抽象的API,通过其ISettingsService实现来存储和检索设置。可能会好奇,为什么要抽象一个似乎在所有支持的平台上都存在的API集合。有几个原因。尽管.NET Standard中存在一个Isolated Storage Settings API,但该API在所有平台上的行为可能并不像期望的那样。特别是,在WPF实现中,IsolatedStorageSettings.ApplicationSettings为null。Codon通过自定义实现解决了这个问题,支持WPF。
抽象设置API的另一个原因是,它为提供了替换底层存储提供商的机会,例如,使用SQLite实现。当用户开始报告设置被重置时,为应用程序之一做了这样的操作,意识到需要一个更健壮的存储提供商。
注意:设置服务能够序列化和存储任何对象或基本类型。对于复杂类型,使用二进制序列化。
Page1ViewModel类的UpdateCreationCount方法在每次实例化视图模型时被调用。参见示例1。该方法检索具有键Page1CreationCount的设置以及默认值。如果不存在这样的设置,则返回默认值。然后通过ISettingsService.SetSetting递增设置。将视图模型的CreationCount属性设置为设置值。
void UpdateCreationCount()
{
const string key = "Page1CreationCount";
/*
* 使用设置服务检索、递增并存储计数器。
* 设置服务是跨平台的。
*/
int count = settingsService.GetSetting(key, 0);
settingsService.SetSetting(key, ++count);
CreationCount = count;
}
在UWP项目中将CreationCount属性绑定到文本字段,如下所示:
<TextBlock Text="{x:Bind ViewModel.CreationCount, Mode=OneWay}" />
在WPF项目中,以类似的方式绑定(不使用x:Bind):
<TextBlock Text="{Binding CreationCount}" />
而在Android项目中,这样做:
<TextView l:Binding="Target=Text, Path=CreationCount" android:id="@+id/Page1_TextView_ShownCount" ... />
注意:Codon的Android数据绑定基础设施要求具有数据绑定的视图具有android:id属性。