9

ListBox と 3 つのボタンを持つ DocumentListView.Xaml があります。

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

AdministrationController、BillingController、ReportController のような 3 つのコントローラーがあります。

すべての Controller には、 Customer 1 : N Order 1: N Document のような ObservableCollections があり、他の Controller と同じです。

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

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

Buttons IsEnabled プロパティを false に設定しても、ボタンは永久に無効な状態のままになるため、役に立ちません。No CanExecute TRUE は IsEnabled = true に設定します。

そして、別のプロパティ IsButtonEnabled を導入したくありません...それはばかげています。なぜなら、ボタンロジックの背後に世界の winform と wpf の両方があるからです... ICommand で十分なはずです。

4

2 に答える 2

20

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

<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>
于 2010-12-12T21:48:09.517 に答える
5

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

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

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" />
于 2010-12-12T20:16:26.967 に答える