Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 仅当列表框中的项目被选中时才启用该按钮_Wpf_Wpf Controls_Mvvm Light - Fatal编程技术网

Wpf 仅当列表框中的项目被选中时才启用该按钮

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

我使用的是MVVM Light,我有一个带有数据模板的列表框,这样列表框的每一行都会显示一个“编辑”按钮和一个名称

我可以使用
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上的人员

我想知道的是,是否有办法做到以下任一点:

  • 保持所有编辑按钮处于启用状态,当用户单击其中一个按钮时,该按钮所属的行将成为列表框的SelectedItem,确保在单击按钮时将预期的person项目作为CommandParameter传递
  • 禁用所有编辑按钮,并且当选择列表框中的某个人时,仅启用该列表框行的编辑按钮,再次确保将所需用户作为命令的CommandParameter传递
  • 谢谢, 史蒂夫


    更新:像这样的事情怎么样(它不起作用,但我可能只是做错了什么)

    
    

    我所说的部分在
    按钮上。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}"