我在这里想要实现的是一个带有 MvvmCross 的全局加载指示器。
从我目前收集的信息来看,我可以通过使用 BaseView 和 BaseViewModel 来实现这一点。BaseViewModel 应包含 BaseView 可以绑定到的 IsLoading 属性。因此,我可以在我的任何 ViewModel 中将 IsLoading 设置为 true 以显示指示器。
BaseViewModel 看起来像这样:
public abstract class BaseViewModel : MvxViewModel
{
private bool _isLoading = false;
public bool IsLoading
{
get { return _isLoading; }
set { _isLoading = value; RaisePropertyChanged(() => IsLoading); }
}
private string _loadingMessage = "Loading...";
public string LoadingMessage
{
get { return _loadingMessage; }
set { _loadingMessage = value; RaisePropertyChanged(() => LoadingMessage); }
}
}
至于绑定到 ViewModel,这个问题在这里得到了解决:https ://stackoverflow.com/a/10930788
我能够通过附加到 PropertyChanged 事件成功地收听 IsLoading,但是,由于这不是一个“真正的”绑定,如果在附加到事件之前将 IsLoading 设置为 true(例如在加载视图之前),它不会触发)。
接下来,我尝试调用 AddBindings 以附加到我的 BaseViewModel 以便在两个属性之间创建真正的绑定,尽管这似乎不起作用(没有错误)。
这是我的 BaseView 目前在 iOS 上的样子:
public abstract class BaseView<TViewModel> : MvxViewController where TViewModel : BaseViewModel
{
public TViewModel ViewModel
{
get { return (TViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
protected BaseView(string nib, NSBundle bundle) : base(nib, bundle)
{
}
private LoadingOverlay _loadingOverlay;
public override void ViewDidLoad()
{
base.ViewDidLoad();
_loadingOverlay = new LoadingOverlay(View.Frame);
this.AddBindings(new Dictionary<object, string>()
{
{this, "{'IsLoading':{'Path':'IsLoading'}}"},
{_loadingOverlay, "{'LoadingMessage':{'Path':'LoadingMessage'}}"}
});
}
public bool IsLoading
{
set
{
if (value)
View.Add(_loadingOverlay);
else
_loadingOverlay.Hide();
}
}
}
AddBindings 有什么我可能不知道的陷阱吗?还是我应该使用一种更新的方法?
感谢您的帮助,谢谢。