0

私は次のものを持っています:

    <Button Content="Do XXX" Height="23" Name="btnXXX"
                  IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoXXX)}" />
    <Button Content="Do YYY" Height="23" Name="btnYYY"
                  IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoYYY)}" />

非常にうまく機能し、インターフェイスがYYYに対して同様にXXX、btnYYYを実行できるかどうかに応じて、btnXXXが有効または無効になります。

ただし、クリックごとに1つのアクションを強制するには、ボタンの1つがクリックされたらすべてのボタンを無効にします。つまり、依存関係を一時的にオーバーライドしてボタンを無効にし、アクションが実行されたら、依存関係の条件を再確立します。

だから私の質問は:すべてのボタンを一時的に無効にしてから依存関係を再開するにはどうすればよいですか?

4

2 に答える 2

1

通常、「依存関係プロパティをオーバーライドして再開」するのではなく、バインドするプロパティが必要なすべての状態をカプセル化するようにModel/ViewModelを設計します。あなたの場合、これはあなたModel:INameOfInterface.CanDoXXXが最初は真であり、ボタンアクションが実行されているときはいつでも偽である必要があることを意味します(xxx、yyy、...)したがって、CanDoXXXの実行について知っておく必要がありYYYます。モデル内ですべてを混ぜ合わせるのは悪い考えかもしれません。ここでViewModelが役立ちます。

モデルインスタンスは自己認識のみであると想定します。が実行されている場合にのみCanDoXXXfalseになります。それぞれが個別の状態を持つモデルのコレクションを含むViewModelクラスを持つことができます。ここで必要なのは、VMにプロパティを配置することだけです。たとえば、すべてのモデルを反復処理し、いずれかのモデルが機能しているかどうかを確認します(、それを示します)。最後にバインドしますXXXCanExecuteAnyCanDoXXXCanDoYYY

<Button IsEnabled={Binding CanExecuteAny} />

これは潜在的な解決策の1つにすぎず、最適な解決策はデータの正確な構造によって異なります。ここにいくつかの他の考えがあります:

  • すべてのボタンをパネルに配置し、個々のボタンの代わりにパネルを無効にすることができます。
  • インターフェイスを実装ICommandし、ボタンのCommandプロパティをそれにバインドします。RelayCommandコンセプトを参照してください。個人的にはそれを選びます。
  • ボタンには他のボタンがクリックされたかどうかの情報が必要なため、すべてのモデルにアクセスできるグローバル状態のようなものがあると便利な場合があります(完全に依存性注入、DIなしのシングルトンではありません)。

そうは言っても、基本的な考え方は、バインドできる単一のプロパティに必要なすべての情報を含めることです。DPの交換は、実際には機能するように設計された方法ではありません。はBindingすでに更新するために存在するため、複数回設定すると、同じジョブが2回繰り返されます。

于 2012-05-21T12:54:51.537 に答える
1

boolプロパティを作成し、すべてのボタンIsEnableをバインドできます。uが何らかのアクションを実行するときはいつでも、それをfalseにし、アクションを完了した後、それをtrueにして、すべてのボタンに影響を与えます。または、スピナー/ビジーインジケーターを使用できます。

于 2012-05-21T07:28:19.613 に答える