0

メイン ウィンドウの RelayCommand の CanExecute を、おそらく存在しない子ウィンドウにバインドしようとしています。どうすればいいですか?

現在私は持っています:

<MenuItem Header="_Compact" 
       Command="{Binding Path=CurrentChildViewModel.CompactCommand}"
       IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand, 
        Converter={StaticResource NullToBooleanConverter}}"/>

ただし、コンバーターは CurrentChildViewModel (および CanExecuteCompactCommand ではなく) で動作する必要があるため、これは機能していないようですが、その CanExecuteCompactCommand も何らかの方法で含める必要があります。

CurrentChildViewModel != null および CurrentChildViewModel.CanExecuteCompactCommand() が true を返す場合にのみ、メニュー項目を有効にしたい。

(理由: CurrentChildViewModel はウィンドウの ViewModel であり、開くかどうかを指定できます。開いていない場合は、メニュー項目を無効にする必要があります。また、開いている場合は、コンパクト コマンドの CanExecute メソッドでコンパクト コマンドが有効かどうかを確認します。これは、ChildView (モデル) のリストビューで少なくとも 2 つの項目が選択されているようなものです)。

誰でも助けてもらえますか?

4

1 に答える 1

1

コンバーターがCurrentChildViewModelコマンドではなく then のインスタンスを必要とする場合 (remove .CanExecuteCompactCommand) では、一体なぜ、あるコマンドを使用して別のコマンドを実行できるかどうかを判断しているのですか? コマンドの CanExecute を利用する必要があります ( CompactCommand)。


わかりました、私はあなたの実際の問題を理解したと思います。私が正しければ、CurrentChildViewModelまたはCanExecuteCompactCommandが null でない限り、xaml/バインディングは期待どおりに機能します。(コンバーターを取り外したと仮定します。)

これを解決するには、バインディングに追加できます。これにより、ソースが見つからない場合FallbackBalue=falseに使用するバインディングが指示されます。falseまた、これを追加して、ソースが null の場合TargetNullValue=falseに使用するバインディングを指示します (この場合)falseCompactCommand

したがって、次のようになります。

IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand,
                    FallbackValue=false,
                    TargetNullValue=false}"

とはいえ、別のコマンドを実行できるかどうかを判断するためにコマンドを使用することはお勧めしません。私は次のようなことをします:

例えば

<Style TargetType="{x:Type MenuItem}" x:Key="menuItemWithCommand">
    <Style.Triggers>
        <Trigger Property="Command" value="{x:Null}">
            <Setter Property="IsEnabled" Value="False"/>
        </Trigger>
    </Style.Triggers>
</Style>
...
<MenuItem Header="_Compact"
          Style="{StaticResource menuItemWithCommand}"
          Command="{Binding Path=CurrentChildViewModel.CompactCommand}" />
...
CompactCommand= new RelayCommand(CompactCommandExecuted, CompactCommandCanExecute);
private void CompactCommandExecuted(obejct obj)
{   // Do your business
}
private bool CompactCommandCanExecute(object obj)
{
    // return true if the command is allowed to be executed; otherwise, false.
}
于 2012-02-19T00:23:13.360 に答える