1

MVVM アーキテクチャに基づくアプリケーションを作成しています。アプリケーションにはウィザードのようなワークフローがあります。アプリケーションのいくつかのページ (ビュー) で、特定の条件が満たされたときにボタンを自動クリックする必要があります。ビューは、ルート ウィザード ビューの [次へ] ボタンに結び付けられた ClickNextBtn コマンドを持つルート ウィザード ビュー モデルを使用して結び付けられます。したがって、ルート ウィザード ビューに次のようなものが必要です。

<DataTrigger Binding="{Binding Path=CanAutoClickNext}" Value="True">
    <Setter Property="ClickBtn" Value="true" />
</DataTrigger>

上記のサンプルのプロパティは無意味ですが、私がやろうとしていることを伝えるのに役立つことを願っています.

CanAutoClickNext bool プロパティは、Wizard ビュー モデルから利用できます。

[次へ] ボタンを自動クリックする必要があるビューの 1 つで、ルート ウィザード ビュー モデルで最初にインスタンス化されたときに、WizardViewModel を対応するビュー モデルのコンストラクターに引数として渡し、それから ClickNextBtn を呼び出してみました。後でビューが実際にロードされたときのメソッド。しかし、驚くべきことではありませんが、それはうまくいきませんでした。

私は wpf ボタンをプログラムでクリックする方法を知っていますが、私のフレームワークですべてを結び付けることは大きな課題であることが証明されています。フィードバックをお待ちしております。

更新: UI デザイン パターン (まだ MVVM) を書き直して、次のページに自動的に移動する代わりに、ページ内の状態が変化し、別のコントロール セットがアクティブになるようにしました。次に、ユーザーは [次へ] をクリックするように求められます。

4

2 に答える 2

1

違う角度からフォローします。メッセージバスの準備ができているとしましょう ( IEventAggregator, IMessenger, は関係ありません)。Caliburn.MicroIEventAggregatorを命名法と一緒に使用します。それが私が最もよく知っているからです。これで、非常に単純なイベントが発生する可能性があります。

public class MoveNext
{
}

次に、ウィザードの「ホスト」ビューモデル:

public class WizardHost : IHandle<MoveNext>
{
    private readonly IEventAggregator messageBus
    public WizardHost(IEventAggregator messageBus)
    {
        this.messageBus = messageBus;
        this.messageBus.Subscribe(this);
    }

    /here you might have the 'real' command method, e.g:
    public void GoToNextQuestion()
    {
        // do stuff
    }

    public void Handle(MoveNext message)
    {
        GoToNextQuestion();
    }
}

public class WizardPage 
{
    private readonly IEventAggregator messageBus;

    private bool shouldMoveToNext;
    public WizardPage(IEventAggregator messageBus)
    {
        this.messageBus = messageBus;

    }

    public void DoStuff()
    {
        //at some point, you might want to switch the flag or do whatever you need/want to do and:
        if(shouldMoveToNext)
            messageBus.Publish(new MoveNext());
    }
}

DoStuff()ウィザード ページでイベントを発行すると、「ホスト」ページが反応してページをめくります。

そこにあるMVVMフレームワークを使用している場合は、もちろんそれで十分です。MVVM Light には がありMessenger、Caliburn.Micro には - お気づきかもしれませんが - がありますIEventAggregator

于 2013-05-08T09:32:34.370 に答える