Mvvmcross 加载指示器未显示

Posted

技术标签:

【中文标题】Mvvmcross 加载指示器未显示【英文标题】:Mvvmcross Loading Indicator not showing 【发布时间】:2014-11-28 10:44:57 【问题描述】:

我正在使用 mvvmcross 开发一个跨平台应用程序,它以最突出的方式帮助我们。

我在加载指示器显示方面遇到了一个小问题。

我的 BaseViewModel 中有一个名为 IsLoading 的属性

    public abstract class BaseViewModel : MvxViewModel
    
       #region IsLoading

        private bool _IsLoading;
        public bool IsLoading
        
            get  return _IsLoading; 
            set
            
                _IsLoading = value;
                RaisePropertyChanged(() => IsLoading);
            
        

        #endregion
    

现在,我有 MainViewModel,它在其中创建两个视图模型的实例,如下所示。

public class MainViewModel : BaseViewModel

    public DashBoardViewModel DashboardVM
    
        get  return _DashBoardVM; 
        set
         
            _DashBoardVM = value;
            RaisePropertyChanged(() => DashboardVM);
        
    

    public AccountViewModel AccountVM
    
        get  return _AccountVM; 
        set
        
            _AccountVM = value;
            RaisePropertyChanged(() => AccountVM);
        
    
    public MainViewModel()
    
        //To Do 
    

    public async Task Init()
    
        DashboardVM = new DashBoardViewModel();            
        AccountVM = new AccountViewModel();
        await Task.Delay(0);
    

下面是我的 DashBoardViewModel

public class DashBoardViewModel : BaseViewModel

     public DashBoardViewModel()
     
         IsLoading = true;
         //Code to get data
     

正如你在上面的代码中看到的,我已经设置了 IsLoading = true,但是在客户端我们没有得到这个属性的 propertychanged 事件。

下面是我显示进度对话框的客户端代码之一。

android 上我们使用片段,下面是我的 MainView 活动

public class MainView : MvxFragmentActivity

    private ViewPager _viewPager;
    private TabPageIndicator _pageIndicator;
    private MvxViewPagerFragmentAdapter _adapter;
    protected override void OnCreate(Bundle bundle)
    
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.MainView);

        var fragments = new List<MvxViewPagerFragmentAdapter.FragmentInfo>
          
            new MvxViewPagerFragmentAdapter.FragmentInfo
            
              FragmentType = typeof(DashboardFragment),
              Title = "",
              ViewModel = ViewModel.DashboardVM
            ,

            new MvxViewPagerFragmentAdapter.FragmentInfo
            
              FragmentType = typeof(MyProfileFragment),
              Title = "",
              ViewModel = ViewModel.AccountVM
            
          ;
        _viewPager = FindViewById<ViewPager>(Resource.Id.viewPager);
        _adapter = new MvxViewPagerFragmentAdapter(this, SupportFragmentManager, fragments);
        _viewPager.Adapter = _adapter;

        _pageIndicator = FindViewById<TabPageIndicator>(Resource.Id.viewPagerIndicator);

        _pageIndicator.SetViewPager(_viewPager);
        _pageIndicator.CurrentItem = 0;
                  

下面是我的 DashBoardFragment 类

public class DashboardFragment : MvxFragment

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, 
                                       Bundle savedInstanceState)
    
        var ignore = base.OnCreateView(inflater, container, savedInstanceState);
        var viewToReturn = this.BindingInflate(Resource.Layout.Dashboard, null);

                    #region MVVMCROSS Binding

        var set = this.CreateBindingSet<DashboardFragment, DashBoardViewModel>();

        #endregion

        #region Handle Progress bar

        //initializing bindableprogress 
        var _bindableProgress = new BindableProgress(Activity);
        //Binding with viewmodel property 
        set.Bind(_bindableProgress).For(m => m.IsLoading).To(vm => vm.IsLoading);

        #endregion

        #region Bind the set

        set.Apply();

        #endregion

        return viewToReturn;
    

注意:BindableProgress 是具有显示加载属性的类,它在简单的 ViewModel 上工作正常。

请帮我解决这个问题。

谢谢 阿曼

【问题讨论】:

【参考方案1】:

我不认为这是正确的:

public class DashBoardViewModel : BaseViewModel

 public DashBoardViewModel()
 
     IsLoading = true;
     //Code to get data
 

您可能不希望在创建视图模型时在构造函数中发生这种情况,但尚未显示它们。这就是您看不到指示器的原因,因为您将 IsLoading 设置为 true 但那不是活动屏幕。

这样的东西有用吗?

public async Task Init()

    IsLoading = true;
    DashboardVM = new DashBoardViewModel();            
    AccountVM = new AccountViewModel();
    await Task.Delay(0);
    IsLoading = false;

这里的想法是您应该在子视图模型的初始化期间显示 MainView 模型的加载指示器。

【讨论】:

以上是关于Mvvmcross 加载指示器未显示的主要内容,如果未能解决你的问题,请参考以下文章

在 mvvmcross 中显示非视图/视图模型的视图

当页面数据未从 Firebase 完全加载时显示加载指示器/微调器 - Flutter

iOS 网络活动指示器未显示

MBProgressHud 在显示网络活动指示器时未显示

活动指示器未显示在视图前面

Alamofire 网络活动指示器未显示