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 に設定されている場合 (ビューが読み込まれる前など) は起動しません。 )。

次に、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 の落とし穴はありますか? または、私が使用する必要がある新しい方法がありますか?

私は助けに感謝します、ありがとう。

4

1 に答える 1

0

v3 を使用している場合は、デフォルトで新しい「スイス」スタイルのバインディングに切り替える必要があります。

これらは、Json テキストを次のように変更します。

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

次のような単純なテキストに変換します。

 "LoadingMessage LoadingMessage"

詳細については、http://blog.ostebaronen.dk/2013/01/awesome-mvvmcross-swiss-bindings-for.htmlを参照してください。


v3 で使用できるもう 1 つのオプションは、「流暢なバインディング」です。これらの動作を確認するには、N+1 シリーズのすべての iOS サンプル ( http://mvvmcross.wordpress.com/ ) を参照するか、 Fluent Bindings や UIB​​utton タイトルなどの質問を参照してください。

例:

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

追加のトレースを有効にすると、デバッグにも役立つ場合があります - MvvmCross Mvx.Trace の使用法を参照してください

于 2013-06-26T18:25:17.787 に答える