Wpf 仅当列表框中的项目被选中时才启用该按钮
我使用的是MVVM Light,我有一个带有数据模板的列表框,这样列表框的每一行都会显示一个“编辑”按钮和一个名称 我可以使用Wpf 仅当列表框中的项目被选中时才启用该按钮,wpf,wpf-controls,mvvm-light,Wpf,Wpf Controls,Mvvm Light,我使用的是MVVM Light,我有一个带有数据模板的列表框,这样列表框的每一行都会显示一个“编辑”按钮和一个名称 我可以使用EventToCommand和RelayCommand对象将按钮连接到ViewModel 我还可以禁用按钮控件,直到列表框中的一个项目被选中,并且按钮上有一个数据触发器。这是xaml: <DataTrigger Binding="{Binding ElementName=lbPlayersList, Path=SelectedItem}" Value
EventToCommand
和RelayCommand
对象将按钮连接到ViewModel
我还可以禁用按钮控件,直到列表框中的一个项目被选中,并且按钮上有一个数据触发器。这是xaml:
<DataTrigger
Binding="{Binding ElementName=lbPlayersList, Path=SelectedItem}"
Value="{x:Null}">
<Setter Property="Button.IsEnabled" Value="False"/>
</DataTrigger>
这是我的问题。选择项目后,所有按钮都将启用。因此,如果您选择列表中的项目1,所有按钮都将启用,这意味着您可以在选择项目1时单击项目2上的按钮,然后将项目1中的人员作为CommandParameter传递,而不是项目2上的人员
我想知道的是,是否有办法做到以下任一点:
更新:像这样的事情怎么样(它不起作用,但我可能只是做错了什么)
我所说的部分在
按钮上。Style
我将尝试检查它的祖先(它所属的listboxitem)是否被选中,如果被选中,则启用该按钮。但是,当选择项目时,按钮未启用。最简单的方法可能是在PersonViewModel
中实现IsSelected
属性,并使用双向绑定将其绑定到ListBoxItem
的IsSelected
。现在,您可以通过CommandParameter
(CommandParameter=“{Binding}”
)将此人传递给您的命令
一旦此基础结构就位,您现在可以使用命令的CanExecute
方法-接受commandParameter
作为输入-确定是否选择了此人,因此应启用您的命令(“愿望列表”中第2点的解决方案)
对于“愿望清单”中的第1点,实施更为简单:
new RelayCommand(
(p) => { /* execution method, p holds the command parameter */ }
(p) => { /* can execute method, p holds the command parameter */ }
);
绑定:
<Button Content="Edit"
Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
CommandParameter="{Binding}"
UPDATE:像这样的东西怎么样(它不起作用,但我可能只是做错了什么)。在我更新的帖子中看到上面的代码。
<Button Content="Edit"
Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
CommandParameter="{Binding}"