C# 绑定RelayCommand和附加条件

C# 绑定RelayCommand和附加条件,c#,wpf,binding,converter,relaycommand,C#,Wpf,Binding,Converter,Relaycommand,我正在尝试将主窗口中RelayCommand的CanExecute绑定到可能不存在的子窗口。我该怎么做 目前我有: <MenuItem Header="_Compact" Command="{Binding Path=CurrentChildViewModel.CompactCommand}" IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand, Convert

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

目前我有:

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

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

我希望仅当CurrentChildViewModel!=null且CurrentChildViewModel.CanExecuteCompactCommand()返回true时才启用菜单项

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


有人能帮忙吗?

如果您的转换器需要
CurrentChildViewModel
的实例,请绑定到该实例,而不是命令(删除
.CanExecuteCompactCommand
) 这就是为什么您要使用一个命令来确定另一个命令是否能够执行的原因?您应该利用命令的CanExecute(
CompactCommand


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

要解决此问题,可以将
fallbackvalue=false
添加到绑定中,这告诉绑定在找不到源时使用
false
。还可以添加
TargetNullValue=false
这告诉绑定在源为null时使用
false
CompactCommand

所以它看起来像:

IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand,
                    FallbackValue=false,
                    TargetNullValue=false}"
也就是说,我仍然不鼓励使用命令来确定是否可以执行另一个命令。我会这样做:

e、 g


...
...
CompactCommand=新的RelayCommand(CompactCommandExecuted,CompactCommandCanExecute);
已执行的私有void CompactCommandExecuted(obejct obj)
做你的事
}
私有布尔CompactCommandCanExecute(对象obj)
{
//如果允许执行命令,则返回true;否则返回false。
}

我只想调用一个命令,但该命令位于子视图模型内,并且并不总是打开。因此,我只能在CurrentChildViewModel不为null时调用它。这对我来说没有意义,您需要澄清您不理解的地方。我在问题中添加了一行,我真正想要的是:我希望菜单项处于启用状态仅当CurrentChildViewModel!=null且CurrentChildViewModel.CanExecuteCompactCommand()时才启用返回true。您说应该删除CanExecuteCompactCommand,但它包含一些能够执行该命令所必需的先决条件。我将在问题中添加更多文本。tagetNullValue应设置为false,我已更正了答案中的错误。我猜您使用了我在建议中发布的样式你应该做你想做的事。这种风格适用于所有
MenuItem
,甚至那些应该没有命令的,因此它们被禁用。我在
风格中添加了一个名称,并将其应用于答案中的
MenuItem
<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.
}