2013-06-26 69 views
0

我想在這裏實現的是帶有MvvmCross的全局加載指示器。MvvmCross:將BaseView屬性綁定到BaseViewModel屬性

從我到目前爲止收集的情況看來,我可以通過使用BaseView和BaseViewModel來實現此目的。 BaseViewModel應該包含BaseView可以綁定到的IsLoading屬性。因此,我可以在我的任何ViewModels中將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); } 
    } 
} 

至於綁定到視圖模型,這個問題在這裏解決:https://stackoverflow.com/a/10930788

我能夠成功通過附加到PropertyChanged事件來聽IsLoading,然而,因爲這不是「真正的」綁定,所以如果在附加到事件之前IsLoading設置爲true(例如在加載視圖之前),它將不會觸發。

接下來,我嘗試調用AddBindings以附加到我的BaseViewModel,以便在兩個屬性之間創建一個真正的綁定,儘管這看起來不起作用(沒有錯誤)。

這裏是我的基本視點目前看起來針對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

如果您使用的是v3,那麼默認情況下您必須切換到新的「瑞士」樣式綁定。

這些變化JSON文本,如:

"{'LoadingMessage':{'Path':'LoadingMessage'}}" 

到像簡單的文字:

"LoadingMessage LoadingMessage" 

更多關於這一點,看看你能在使用http://blog.ostebaronen.dk/2013/01/awesome-mvvmcross-swiss-bindings-for.html


一個進一步的選擇v3是'流暢的綁定'。看到這些行動中,看到所有的iOS的樣品中的N + 1系列 - http://mvvmcross.wordpress.com/,或問題,如Fluent Bindings and UIButton titles

比如像:

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

這也可能有助於進行調試,如果你啓用附加跟蹤 - 請參閱MvvmCross Mvx.Trace usage

相關問題