我在这里想要实现的是一个带有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有任何陷阱吗?或者是否有一种我应该使用的新方法?
我感谢您的帮助,谢谢。
答案 0 :(得分:0)
如果您使用的是v3,则默认情况下您必须切换到新的“瑞士”样式绑定。
这些改变Json文本如:
"{'LoadingMessage':{'Path':'LoadingMessage'}}"
更简单的文字,如:
"LoadingMessage LoadingMessage"
有关详情,请参阅http://blog.ostebaronen.dk/2013/01/awesome-mvvmcross-swiss-bindings-for.html
您可以在v3中使用的另一个选项是“流畅的绑定”。要查看这些内容,请参阅N + 1系列中的所有iOS示例 - http://mvvmcross.wordpress.com/或Fluent Bindings and UIButton titles等问题
例如:
this.CreateBinding().For("LoadingMessage").To("LoadingMessage").Apply();
如果启用其他跟踪,它也可能有助于调试 - 请参阅MvvmCross Mvx.Trace usage