簡體   English   中英

綁定RelayCommand和其他條件

[英]Binding a RelayCommand AND an additional condition

我試圖將主窗口中的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,如果未打開,我希望禁用菜單項。如果打開了菜單,我希望Compact命令的CanExecute方法檢查是否執行compact命令可以執行,這類似於在ChildView(模型)的列表視圖中至少選擇了兩項。)

有人可以幫忙嗎?

如果您的轉換器需要CurrentChildViewModel的實例,然后綁定到該實例,而不是綁定到該命令(刪除.CanExecuteCompactCommand ),那這就是為什么您實際上在使用一個命令來確定另一個命令是否應該能夠執行? 您應該利用命令的CanExecute( CompactCommand )。


好的,我想我現在已經了解您的實際問題。 如果我是正確的,那么除非CurrentChildViewModelCanExecuteCompactCommand為null,否則您的xaml /綁定將按預期工作。 (假設您卸下轉換器。)

為了解決這個問題,您可以在綁定中添加FallbackBalue=false ,這告訴綁定在找不到源時使用false 並且還添加TargetNullValue=false這告訴綁定在源為null時使用false (在這種情況下為CompactCommand

因此,它看起來像:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM