0

1 つのクエリ TextBox と 4 つのボタンを含むダイアログがあります。クエリの結果に応じて、1 つ以上のボタンが有効になります。TextBox は VM のプロパティにバインドされ、各ボタンは VM のコマンドにバインドされます。

Command.IsEnabled は QueryResult に基づいて変更されます

class ViewModel
{
  public string Query {get;set;}
  public QueryResult QueryResult {get;set;}
  public ICommand FooCommand {get;set;}
  public ICommand BarCommand {get;set;}
  public ICommand BazCommand {get;set;}
  public ICommand QuxCommand {get;set;}
}

<TextBox Text="{Binding Query, UpdateSourceTrigger=PropertyChanged}"/>
<Button Command="{Binding FooCommand}" Content="Foo"/>
<Button Command="{Binding BarCommand}" Content="Bar"/>
<Button Command="{Binding BazCommand}" Content="Baz"/>
<Button Command="{Binding QuxCommand}" Content="Qux"/>

有効なボタンのどれをデフォルトにするかを決定する追加のロジックがあります (Enter キーを押すと、視覚的に強調表示され、アクティブになります)

(Foo は常に有効、QueryResult.A が null でない場合は Bar が有効、QueryResult.B が null でない場合は Baz が有効、など。複数のコマンドを有効にできますが、デフォルトを決定する固定の優先順位があります。アクション)

バー > バズ > フー > クックス

私の問題は、ボタンに Button.IsDefault をバインドして、どれをデフォルトにするかを反映する方法です。

次のオプションを考えました-どちらも正しくないようです

  1. VM に列挙型プロパティ {btn1,btn2,btn3,btn4} DefaultButton を作成します。パラメータを現在の値と比較するコンバーターを使用して、各ボタンの IsDefault プロパティをこれにバインドします。

  2. VM IsButton1Default などに 4 つのブール型プロパティを作成し、これらにバインドします。

  3. スタイル+データトリガーを使用したものですが、それによりXAMLが理解しにくくなっています。

あなたならどうしますか?

4

1 に答える 1

0

この種のロジック用のコンバーターは好きではないので、2 番を選択します。ユニットテストも簡単で、理解と実装がより簡単です:)

于 2012-04-19T08:46:05.370 に答える