Xamarin.Forms 如何在没有保存按钮的情况下将模型保存到数据库,最佳实践

Xamarin.Forms How to save model to database without savebutton, Best practises

我和我的同事想创建一个包含一些页面的应用程序,允许用户在其中更改一些设置。这些设置页面没有保存按钮。有一个主设置页面和两个子设置页面。如果用户从三个页面之一导航回来,或者用户在其中一个子页面中进行了一些更改,则应该保留这些设置。 该模型在主设置页面的 OnAppearing() 方法中加载。所以我们不能使用子页面的OnDisappearing()方法来保存模型,因为这些方法和导航页面的Pushed()和Popped()的顺序在每个平台上都是不同的:forums.xamarin.com/discussion/21417/navigationpage-push-pop-event-sequence-different-across-platforms

我们此时的解决方案是将模型保存在子页面视图模型属性的设置器中。但这不是最佳做法。所以我们的问题是:有没有其他方案可以解决这个问题?该问题的最佳做法是什么?

代码:

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);
    }

您的代码有待改进。

您不应该从 属性 进行导航 - 如果您要离开,至少将其作为一种方法。该方法应该是 async 而对于 _navigation.PopAsync()

你应该是 await

即使调用 Save() 也不应该存在。考虑如果在保存时发生异常会发生什么:重复键、空字段等都是可能的。那么不仅你不会 Save 而且你也不会 PopAsync 并且你的 ListViewSelectedItem = newItem 也会导致你选择的项目处理程序爆炸。如果您要有一个 属性 也可以处理显示错误消息,那么您肯定在 MessyCode 领域内。

您可以在模型上使用 PropertyChanged (ReminderRepetitive),并在 属性 更改后立即保存。

看起来您有一个 _businessLayer 保存或更新的整个业务可能属于那里。

总的来说,你的问题很宽泛,可以视为 "opinion based"。下次尝试询问您不确定或导致错误的代码的特定部分 - 或者使用 Code Review