我的同事和我想创建一个包含某些页面的应用程序,允许用户更改某些设置。这些设置页面没有保存按钮。有一个主设置页面和两个子设置页面。如果用户从三个页面中的一个页面导航回来或者用户在其中一个子页面中进行了一些更改,则应该保留这些设置。 模型将加载到主设置页面的OnAppearing()方法中。因此我们不能使用子页面的OnDisappearing()方法来保存模型,因为这些方法的顺序以及导航页面的Pushed()和Popped()在每个平台上都有所不同:forums.xamarin.com/discussion/21417/navigationpage -push-弹出事件序列不同-跨平台
此时我们的解决方案是将模型保存在子页面视图模型属性的setter中。但这不是最好的做法。所以我们的问题是:有没有其他解决方案来解决这个问题?该问题的最佳做法是什么?
代码:
public ReminderRepetitive ListViewSelectedItem
{
get { return _settingsEntity.ReminderRepetitive; }
set
{
if (!Equals(_settingsEntity.ReminderRepetitive, value))
{
_settingsEntity.ReminderRepetitive = value;
OnPropertyChanged("ListViewSelectedItem");
Save();
_navigation.PopAsync();
}
}
}
public void Save()
{
_businessLayer.UpdateSettings(_settingsEntity);
}
答案 0 :(得分:1)
您的代码可以进行改进。
你不应该从一个属性进行导航 - 如果你要导航,至少要做一个方法。该方法应为async
,await
_navigation.PopAsync()
即使调用Save()也不应该在那里。考虑如果在保存时发生异常会发生什么:重复键,空字段等都是可能的。然后,不仅你赢了Save
,而且你也赢了PopAsync
,你的ListViewSelectedItem = newItem
也会导致你选择的物品处理程序爆炸。如果您将拥有一个也处理显示错误消息的属性,那么您肯定会在MessyCode领域内完成。
您可以在模型上使用PropertyChanged(ReminderRepetitive),并在更改属性后立即保存。
看起来您有_businessLayer
整个保存或更新业务可能属于那里。
总体而言,您的问题非常广泛,可以视为基于意见的问题"。下次尝试询问您不确定或导致错误的代码的特定部分 - 或使用Code Review