数据持久化
为了提供更好的用户体验,您的应用程序应该能够在应用程序暂停时将状态保存到磁盘,并在应用程序恢复时恢复状态。ReactiveUI提供了一些功能,允许您通过在应用程序关闭或暂停时序列化视图模型树来持久化应用程序状态。在本教程中,我们将介绍ReactiveUI的功能,帮助我们管理超过进程生命周期的状态。
注释视图模型
视图模型序列化是一项棘手的任务。我们必须决定在应用程序关闭时保存哪些视图模型的属性,以及在重新创建时保存哪些属性。以我们典型的搜索屏幕视图模型为例,我们肯定希望保存和恢复搜索查询,因此我们使用[DataMember]属性对公共属性进行注释。我们不希望将命令的状态保存到磁盘上,因此我们使用[IgnoreDataMember]属性标记该命令。这些属性在标准库中可用,但也可以轻松使用其他注释,例如[JsonProperty]或[JsonIgnore]。
[DataContract]
public class MainViewModel : ReactiveObject
{
private string _searchQuery;
public MainViewModel()
{
var canSearch = this
.WhenAnyValue(x => x.SearchQuery)
.Select(query => !string.IsNullOrWhiteSpace(query));
Search = ReactiveCommand.CreateFromTask(
() => Task.Delay(1000), // 一个长时间运行的操作
canSearch);
}
[IgnoreDataMember]
public ReactiveCommand<Unit, Unit> Search { get; }
[DataMember]
public string SearchQuery
{
get => _searchQuery;
set => this.RaiseAndSetIfChanged(ref _searchQuery, value);
}
}
没有必要保存实现ICommand接口的响应式命令的状态。ReactiveCommand<TIn, TOut>类通常在构造函数中初始化,其CanExecute指示器通常完全依赖于视图模型属性,并在任何这些属性更改时重新计算。
创建视图
接下来,我们修改MainWindow类以遵循标准的ReactiveUI模式。
public class MainWindow : ReactiveWindow<MainViewModel>
{
public MainWindow()
{
AvaloniaXamlLoader.Load(this);
this.WhenActivated(disposable => { });
}
}
我们的ReactiveWindow的XAML如下所示:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ReactiveUI.Samples.Suspension.MainWindow"
Title="ReactiveUI.Samples.Suspension">
<TextBox Text="{Binding SearchQuery, Mode=TwoWay}"
Watermark="请输入搜索查询"
Margin="20" />
</Window>