我正在使用MVVM Light,我有一个带有数据模板的列表框,这样列表框的每一行都会显示一个“编辑”按钮和一个名称。
我可以使用EventToCommand
和RelayCommand
对象将按钮连接到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项的人。
我想知道的是,是否有办法执行以下任一操作:
谢谢, 史蒂夫
更新:这样的事情怎么样(它不起作用,但我可能只是做错了什么)。
<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)是否被选中,如果是,则启用该按钮。但是,选择项目时未启用该按钮。
答案 0 :(得分:1)
可能最简单的方法是在IsSelected
中填充PersonViewModel
属性,并使用双向绑定将其绑定到IsSelected
的{{1}}。现在,您可以通过ListBoxItem
(CommandParameter
)将此人传递给您的命令。
一旦此基础架构到位,您现在可以使用命令的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 */ }
);