2012-02-19 8 views
0

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

<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 thaですtを開くかどうか、開いていない場合は、メニュー項目を無効にします。コンパクトコマンドのCanExecuteメソッドを開いて、コンパクトコマンドを実行できるかどうかを確認します。これは、ChildView(モデル)のリストビュー内の少なくとも2つのアイテムが選択されているかどうかを確認するためです)。

Canone anyone助けてください?なぜ地球上であなたは別のコマンドを実行することができるかどうかを決定するために、1つのコマンドを使用していると述べたCurrentChildViewModelのインスタンスを必要とする、あなたのコンバータ場合は、コマンドそれに結合していない

答えて

1

.CanExecuteCompactCommandを削除) ?コマンドのCanExecute(CompactCommand)を利用する必要があります。


私はあなたの実際の問題を今理解していると思います。 私が正しい場合、CurrentChildViewModelまたはCanExecuteCompactCommandがヌルでない限り、xaml/bindingsは期待通りに機能します。

これを解決するには、FallbackBalue=falseをバインディングに追加できます。これは、ソースが見つからない場合にバインドにfalseを使用するように指示します。それは私がまだコマンドの使用を阻止するだろうと述べ

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

:そしてまた、これはソースがnullのときのように

だから、それはなります(この場合はCompactCommandを)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. 
} 
+0

私は1つのコマンドを呼びたいだけですが、そのコマンドは子ビューモデルの中にあり、必ずしも開いているわけではありません。したがって、CurrentChildViewModelがnullでない場合にのみ呼び出すことができます。 –

+0

私はまだあなたの答えを完全に理解していません... –

+0

それは私にとって意味をなさない、あなたは理解していないことを明確にする必要があります。 – Terkel