绑定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中至少选择了两个项目。)
有人能帮忙吗?
如果转换器需要CurrentChildViewModel
的实例,则绑定到该实例而不是命令(移除.CanExecuteCompactCommand
)也就是说,你到底为什么要使用一个命令来确定另一个命令是否能够执行?您应该使用命令(CompactCommand
)的CanExecute。
好吧,我想我现在明白你的实际问题了。如果我是正确的,那么除非CurrentChildViewModel
或CanExecuteCompactCommand
为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.
}