MvvmCross:将BaseView属性绑定到BaseViewModel属性

时间:2013-06-26 18:13:22

标签: ios binding mvvmcross

我在这里想要实现的是一个带有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有任何陷阱吗?或者是否有一种我应该使用的新方法?

我感谢您的帮助,谢谢。

1 个答案:

答案 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