绑定RelayCommand AND附加条件

本文关键字:附加条件 AND RelayCommand 绑定 | 更新日期: 2023-09-27 18:25:00

我正试图将主窗口中RelayCommand的CanExecute绑定到可能不存在的子窗口。我该怎么做?

目前我有:

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

然而,这似乎不起作用,因为转换器应该在CurrentChildViewModel上工作(而不是CanExecuteCompactCommand,但我也应该以某种方式包含CanExecuteCompact命令。

仅当CurrentChildViewModel!=null,CurrentChildViewModel.CanExecuteCompactCommand()返回true。

(原因:CurrentChildViewModel是一个窗口的ViewModel,可以打开也可以不打开,如果没有打开,我希望菜单项被禁用。如果打开了,我希望Compact命令的CanExecute方法检查Compact命令是否可以执行,这类似于在ChildView(Model)的listview中至少选择了两个项目。)

有人能帮忙吗?

绑定RelayCommand AND附加条件

如果转换器需要CurrentChildViewModel的实例,则绑定到该实例而不是命令(移除.CanExecuteCompactCommand)也就是说,你到底为什么要使用一个命令来确定另一个命令是否能够执行?您应该使用命令(CompactCommand)的CanExecute。


好吧,我想我现在明白你的实际问题了。如果我是正确的,那么除非CurrentChildViewModelCanExecuteCompactCommand为null,否则您的xaml/绑定将按预期工作。(假设您移除转换器。)

为了解决这个问题,您可以将FallbackBalue=false添加到绑定中,这将在绑定找不到源时告诉它使用false。同时添加TargetNullValue=false,这告诉绑定在源为空时使用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.
}