4

我现在正在研究 Xamrin Form。我对 ViewModel 的清晰数据有疑问。

当我注销并以不同的用户登录时,它会显示以前用户的数据,因为值UserProfileViewModel不清楚。

当用户注销时,我想从 UserProfileViewModel 类文件中清除用户数据。目前,当用户单击注销时,我手动执行此操作。我想要像 dispose 这样的任何默认方法来清除所有类成员。

我试图继承 IDisposable 接口,this.Dispose();但这也没有用。

我也尝试过使用以下默认构造函数,但它会引发错误

`System.TypeInitializationException`

在 app.xaml.cs 的这一行:public static ViewModelLocator Locator => _locator ?? (_locator = new ViewModelLocator());

public UserProfileViewModel()
{
    //initialize all class member
}

在给定的代码中,您可以看到在 Logout 调用中,我调用了方法

`ClearProfileData` of `UserProfileViewModel` 
which set default(clear) 

数据。它是手动的。我想在用户注销时清除数据。

查看模型注销页面

 [ImplementPropertyChanged]
    public class LogoutViewModel : ViewModelBase
    {
        public LogoutViewModel(INavigationService nService, CurrentUserContext uContext, INotificationService inService)
        {
            //initialize all class member
            private void Logout()
            {
                //call method of UserProfileViewModel 
                App.Locator.UserProfile.ClearProfileData();
                //code for logout
            }
        }
    }


User Profile View Model

    [ImplementPropertyChanged]
    public class UserProfileViewModel : ViewModelBase
    {
        public UserProfileViewModel(INavigationService nService, CurrentUserContext uContext, INotificationService inService)
        {
            //initialize all class member
        }

        //Is there any other way to clear the data rather manually?
        public void ClearProfileData()
        {
            FirstName = LastName = UserName = string.Empty;
        }
    }

ViewModel Locator

    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            MySol.Default.Register<UserProfileViewModel>();
        }

        public UserProfileViewModel UserProfile => ServiceLocator.Current.GetInstance<UserProfileViewModel>();
    }
4

1 回答 1

4

首先,不需要清理这些原始数据类型,gc 会为您完成。

但是,如果您为此使用消息或任何其他强参考,您 不得不取消订阅它们,否则您的视图模式将在内存中徘徊并且永远不会超出范围

垃圾收集器无法收集应用程序正在使用的对象,而应用程序的代码可以访问该对象。据说该应用程序对该对象具有强引用。

使用 Xamarin,它实际上取决于您如何将 View 耦合到 Viewmodals 以确定您可能采用哪种方法来清理您的 viewmodals。

事实证明,MVVM Light ViewModelBase实现了一个 ICleanup 接口,它您提供了一个可覆盖的 Cleanup 方法。

ViewModelBase.Cleanup 方法

要清理其他资源,请覆盖此方法,清理然后调用 base.Cleanup()。

public virtual void Cleanup()
{
    // clean up your subs and stuff here
    MessengerInstance.Unregister(this);
}

现在你只剩下调用 ViewModelBase.Cleanup 的地方了

如果您在事件中获得对DataContext(Ie ViewModalBase)的引用,则可以在视图关闭时调用它DataContextChanged

或者你可以连接一个BaseView为你探测这个的,或者你可以实现你自己的NagigationService调用Cleanup. Pop它确实取决于谁在创建您的视图和视图模型以及您如何耦合它们

于 2018-02-16T09:56:22.083 回答