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 阻止我的命令被触发。
我已经在 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 阻止我的命令被触发。