ここで達成しようとしているのは、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 に設定されている場合 (ビューが読み込まれる前など) は起動しません。 )。
次に、2 つのプロパティ間の実際のバインディングを作成するために、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 の落とし穴はありますか? または、私が使用する必要がある新しい方法がありますか?
私は助けに感謝します、ありがとう。