Mvvmcross装载指示器未显示

时间:2014-11-28 10:44:58

标签: android ios windows xamarin mvvmcross

我正在使用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在其中创建两个viewmodel的实例,如下所示。

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事件。

下面是我显示progressdialog的客户端代码之一。

在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上工作正常。

请帮我解决这个问题。

由于 Aaman

1 个答案:

答案 0 :(得分:0)

我不相信这是正确的:

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模型的加载指示器。