仅在选择项目时才在ListBox中启用Button

时间:2011-12-15 17:24:35

标签: wpf wpf-controls mvvm-light

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

我可以使用EventToCommandRelayCommand对象将按钮连接到ViewModel。

我也可以禁用按钮控件,直到选中列表框中的某个项目且按钮上有数据触发器。这是xaml:

<DataTrigger
    Binding="{Binding ElementName=lbPlayersList, Path=SelectedItem}"
    Value="{x:Null}">
    <Setter Property="Button.IsEnabled" Value="False"/>
</DataTrigger>

这是我的问题。选择项目后,将启用所有按钮。因此,如果您在列表中选择项目1,则所有按钮都会启用,这意味着您可以单击项目2上的按钮,同时选择项目1,然后将项目1中的人员作为CommandParameter而不是关于第2项的人。

我想知道的是,是否有办法执行以下任一操作:

  1. 保持启用所有编辑按钮,当用户单击其中一个时,它所属的行将成为列表框的SelectedItem,确保在单击按钮时将期望的人物项作为CommandParameter传递< / LI>
  2. 禁用所有编辑按钮,当选择列表框中的某个人时,仅启用列表框该行的编辑按钮,再次确保将所需用户作为命令的CommandParameter传递。 / LI>

    谢谢, 史蒂夫

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

    <DataTemplate x:Key="PlayersListTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <Button Grid.Column="0" IsEnabled="False" Content="Edit" Margin="4,4,8,4" Height="25" Width="25" FontSize="10" VerticalAlignment="Center">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <GalaSoft_MvvmLight_Command:EventToCommand x:Name="EditButtonClick" 
                                                                    Command="{Binding Source={StaticResource Locator}, Path=Main.TestCommand}"
                                                                    CommandParameter="{Binding ElementName=lbPlayersList, Path=SelectedItem}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <Button.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
                                <Setter Property="Button.IsEnabled" Value="True"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
            <StackPanel Grid.Column="1" VerticalAlignment="Center">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="auto"/>
                    </Grid.RowDefinitions>
                    <StackPanel Orientation="Horizontal" Grid.Row="0">
                        <TextBlock Text="{Binding LastName}" FontSize="16" FontWeight="DemiBold" />
                        <TextBlock Text=", " FontSize="16" FontWeight="DemiBold"  VerticalAlignment="Center"/>
                        <TextBlock Text="{Binding FirstName}" FontSize="16" FontWeight="DemiBold" VerticalAlignment="Center"/>
                    </StackPanel>
                    <TextBlock Text="{Binding NickName}" Grid.Row="1" FontSize="10" />
                </Grid>
            </StackPanel>
        </Grid>
    </DataTemplate>
    

    我正在讨论的部分是Button.Style,我会尝试检查它的祖先(它所属的listboxitem)是否被选中,如果是,则启用该按钮。但是,选择项目时未启用该按钮。

1 个答案:

答案 0 :(得分:1)

可能最简单的方法是在IsSelected中填充PersonViewModel属性,并使用双向绑定将其绑定到IsSelected的{​​{1}}。现在,您可以通过ListBoxItemCommandParameter)将此人传递给您的命令。

一旦此基础架构到位,您现在可以使用命令的CommandParameter="{Binding}"方法 - 接受CanExecute作为输入 - 以确定是否选择了此人,因此,您的命令应该是启用(在您的愿望清单&#39;中为第2点提供解决方案)。

对于您的愿望清单中的第1点&#39;实施更加容易:

CommandParamter

结合:

new RelayCommand(
    (p) => { /* execution method, p holds the command parameter */ }
    (p) => { /* can execute method, p holds the command parameter */ }
);