1

我在这里想要实现的是一个带有 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 有什么我可能不知道的陷阱吗?还是我应该使用一种更新的方法?

感谢您的帮助,谢谢。

4

1 回答 1

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 和 UIButton 标题等问题

例如:

 this.CreateBinding().For("LoadingMessage").To("LoadingMessage").Apply();

如果您启用额外的跟踪,它也可能有助于调试 - 请参阅MvvmCross Mvx.Trace 用法

于 2013-06-26T18:25:17.787 回答