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 加载指示器未显示的主要内容,如果未能解决你的问题,请参考以下文章