2012-02-19 74 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可以打開或不打開,如果它沒有打開,我希望菜單項被禁用。如果它被打開,我希望Compact命令的CanExecute方法檢查是否可以執行緊湊命令,這是類似ChildView(Model)中列表視圖中至少兩個項被選中的東西。)

任何人都可以請幫助?

回答

1

如果你需要轉換的CurrentChildViewModel的實例,然後綁定到,而不是命令(刪除.CanExecuteCompactCommand) 這就是說爲什麼地球上,你使用一個命令來確定是否存在另一個命令應該是能夠執行?您應該使用您的命令的可執行文件(CompactCommand)。


好吧我想我現在明白你的實際問題。 如果我是正確的,那麼你的xaml/bindings按預期工作,除非CurrentChildViewModelCanExecuteCompactCommand爲空。 (假設你刪除了你的轉換器。)

爲了解決這個問題,你可以添加FallbackBalue=false到你的綁定,這告訴綁定當它找不到源時使用false。還可以添加TargetNullValue=false這告訴綁定(在這種情況下CompactCommand)使用false當源爲null

所以它看起來像:

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. 
} 
+0

我只想調用一個命令,但該命令在子視圖模型中,並且它並不總是打開。所以我只能在CurrentChildViewModel不爲null時調用它。 – 2012-02-19 00:26:47

+0

所以我仍然不完全明白你的答案... – 2012-02-19 00:34:21

+0

這對我來說沒有意義,你需要澄清你不明白的東西。 – Terkel 2012-02-19 00:43:36