我对WPF比较陌生,所以这可能是微不足道的,但我无法弄清楚这一点。
假设我有一个ListBox
和一个Button
。该按钮绑定到一个命令,该命令对列表中选定的项目执行某些操作。
示例:
<ListBox Name="List" ItemsSource="{Binding Items}" />
<Button Content="Show!" Command="{Binding ShowCommand}" CommandParameter="{Binding ElementName=List, Path=SelectedItem}"/>
我希望当且仅当没有选择任何项目时才禁用该按钮,理想情况下我希望通过ShowCommand.CanExecute
功能执行此操作。
我尝试检查null参数,如果只在开头检查一次,它就可以但。如果我选择一个项目,该按钮仍然是禁用的。
我在这里尝试了这个建议:WPF CommandParameter binding not updating 但它根本不起作用......(同样的问题)我做错了什么?
当我在列表中选择一个项目时,如何让他回忆起canExecute
? 。
答案 0 :(得分:1)
您可以使用DataTrigger
<ListBox Name="List" ItemsSource="{Binding Items}" />
<Button Content="Show!" Command="{Binding ShowCommand}" CommandParameter="{Binding ElementName=List, Path=SelectedItem}">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem,ElementName=List}" Value="{x:Null}">
<Setter Property="IsEnabled" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<强>更新强>
使用CanExecute
无法实现此目的的原因很可能是因为CanExecuteChanged
事件未被提升,以解决您可以利用{{1}通过将此事件与您的命令CommandManager.RequerySuggested
事件[1]相关联。
这是您案例中CanExecuteChanged
的基本实现和使用:
ICommand
VM中定义的命令应如下所示:
public class Command : ICommand
{
private readonly Action<object> _action;
public Command(Action<object> action)
{
_action = action;
}
public bool CanExecute(object parameter)
{
//the selected item of the ListBox is passed as parameter
return parameter != null;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
//the selected item of the ListBox is passed as parameter
_action(parameter);
}
}
您可能还想查看Routed Commands以避免自己提升CanExecuteChanged事件。
答案 1 :(得分:0)
你可以用很少的解决方案来实现它: 1)将ListBox的SelecteItem绑定到视图模型中的某个属性,并在属性setter上调用ShowCommand.RaiseCanExecuteChanged()。 2)使用一些将null转换为布尔值的转换器将按钮的IsEnabled绑定到ListBox的SelecteItem。