2010-12-12 17 views
7

私はListBoxと3つのボタンを持つDocumentListView.Xamlを持っています。WPF/MVVM:UserControlの背後にあるViewModelがまだ初期化されていないときにButtonの状態を無効にしますか?

そのUserControlの背後には、3つのボタンとそのコマンドプロパティが3つのRelayCommandsにバインドされたDocumentListViewModelがあります。

私は、AdministrationController、BillingController、ReportControllerのような3つのコントローラを持っています。

すべてのコントローラには、顧客1:N注文1:NドキュメントのようなObservableCollectionsが他のコントローラと同じです。

私は特別な拘束状況を持っています。私のDocumentListViewModelがOrderViewModelのような親ViewModelによって初期化されていないとき(注文がロードされていない/存在しないため)、私のUserControlには3つのボタンが有効になっています。ユーザーは3つのボタンを押すことができますが、何も起こりませんが、それでも非常に混乱し、特にユーザーインターフェイスの一貫性はなくなりました。

ボタンのコマンドをデフォルトで「無効」に設定するにはどうすればよいですか?

ボタンを設定するIsEnabledプロパティをfalseに設定しても、ボタンは永久に無効な状態にとどまるため、役立たない。 CanExecute TRUEを設定すると、IsEnabled = trueに設定されます。

私は別のプロパティを導入したくありませんIsButtonEnabled ...その愚かなことは、私は両方のwinformsとwpfをボタンのロジックの後ろに持っているからです... ICommandで十分です。

答えて

17

または無効にするボタンのスタイルを使用することができます。

<Style TargetType="{x:Type Button}" x:Key="DisablerButton"> 
    <Style.Triggers> 
     <Trigger Property="Command" Value="{x:Null}"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

あなたのスタイルでは、IsEnabledプロパティはどのようにTRUEに設定されますか? – Elisabeth

+0

トリガーがヒットしない場合はいつでも、通常のプロシージャーが呼び出されます。つまりCommandプロパティが設定され、CanExecuteがtrueと評価されたとき。 – Goblin

+0

作品!それは今カウント!ありがとうゴブリン。 – Elisabeth

5

これは興味深い状況です。正直なところ私は、UIが読み込まれ、インタラクティブになっているが、ViewModelがまだバインドされていないケースに遭遇したことはありません。

ただし、それを無視して、バインディングでFallbackValueを使用して、グローバルに使用可能なNullCommandやCanExecuteメソッドで常にfalseを返すものにバインドする可能性があります。

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" /> 
+0

問題は私のDocumentListViewでは、3回をユーザーコントロールを使用しています。私がCommand = "{SaveCommand、FallbackValue = {x:Null}をバインドする}"/"SaveButtonはまだ有効です。しかし、Commandingで無効にしたいと思っています。 – Elisabeth

+0

私の例は、あなたが指摘したようにボタンを有効にするx:Null値ではなく、グローバルに利用可能なNullCommandに依存しています。いずれにしても、Goblinの回避策はおそらく実装が簡単です。 – Josh

+1

これは特にSilverlightにとって非常に素晴らしいソリューションです。 –

関連する問題