Wpf 命令未触发

Wpf Command not firing

我已经在 XAML 中使用了命令绑定,但奇怪的是这个特定的命令绑定不起作用。我错过了什么吗?

Class 命令:

public class VMCommand : ICommand
{
    public delegate void ICommandOnExecute(object parameter);
    public delegate bool ICommandOnCanExecute(object parameter);

    private ICommandOnExecute _execute;
    private ICommandOnCanExecute _canExecute;

    public VMCommand(Action exec, bool canExec)
    {
        _execute = delegate(object param) { exec(); };
        _canExecute = delegate(object param) { return canExec; };
    }

    public VMCommand(Action<object> exec, bool canExec)
    {
        _execute = delegate(object param) { exec(param); };
        _canExecute = delegate(object param) { return canExec; };
    }

    #region ICommand Members

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute.Invoke(parameter);
    }

    public void Execute(object parameter)
    {
        _execute.Invoke(parameter);
    }

    #endregion
}

Xaml:

<ListBox DataContext="{DynamicResource Client}" ItemsSource="{Binding Players}" Background="{StaticResource BrushDark}" HorizontalContentAlignment="Stretch">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="1*"/>
                                        <ColumnDefinition Width="1*"/>
                                        <ColumnDefinition Width="1*"/>
                                        <ColumnDefinition Width="1*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="1*"/>
                                        <RowDefinition Height="1*"/>
                                    </Grid.RowDefinitions>
                                    <TextBlock Text="{Binding Name}" Foreground="{StaticResource BrushTextNormal}" Grid.Column="0" Grid.Row="0"/>
                                    <TextBlock Text="{Binding KillsZombies}" Foreground="{StaticResource BrushTextNormal}" Grid.Column="1" Grid.Row="0"/>
                                    <TextBlock Text="{Binding Score}" Foreground="{StaticResource BrushTextNormal}" Grid.Column="2" Grid.Row="0"/>
                                    <TextBlock Text="{Binding Ping}" Foreground="{StaticResource BrushTextNormal}" Grid.Column="3" Grid.Row="0"/>
                                    <StackPanel Orientation="Horizontal" Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="1" Name="Actions" Visibility="Collapsed">
                                        <Button Content="Kick" Style="{StaticResource Button}" Margin="20,5,0,0" Width="50" Height="25" DataContext="{DynamicResource Client}" Command="{Binding Test}"/>
                                        <!--{x:Static local:VMServer+PlayerCommand.KICK}-->
                                        <Button Content="Ban" Style="{StaticResource Button}" Margin="20,5,0,0" Width="50" Height="25" Command="{Binding Test}"/>
                                    </StackPanel>
                                </Grid>
                                <DataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
                                        <Setter Property="Visibility" Value="Visible" TargetName="Actions"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsFocused}" Value="False">
                                        <Setter Property="Visibility" Value="Collapsed" TargetName="Actions"/>
                                    </DataTrigger>
                                </DataTemplate.Triggers>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

而在我的虚拟机中:

private VMCommand _test;
    public VMCommand Test
    {
        get
        {
            Action a = new Action(delegate()
            {
                MessageBox.Show("yay");
            });
            return new VMCommand(a, true);
        }
    }

在这种情况下,Client 是我的 Viemodel,其中包含所有需要的东西。

在列表框命令绑定之外似乎很有效(有一个带绑定的连接按钮,工作完美),但 Stackpanel 内的按钮不会在任何时候触发任何事件。

我是不是漏掉了什么?

我相信下面的代码会解决您的问题。 请告诉我。

<Button Content="Ban" Style="{StaticResource Button}" Margin="20,5,0,0" Width="50" Height="25" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}, Path=DataContext.Test}"/>

如果有人遇到 his/her 实施在像我这样的特定情况下无法触发的相同问题,那是我的错:

设置监听两个值的事件true/false 阻止我的命令被触发。