我希望我的DataGrids具有上下文菜单,允许用户向上或向下移动选定的行。经过一些搜索,我想出了以下有问题的代码。似乎CanExecute
只被调用一次(我猜菜单被创建时),所以我的MenuItem将被启用或禁用所有时间。我正在努力实现的是在DataGrid中选择行时启用它,而在没有任何行时禁用它。目前这不起作用。
此外,还有更优雅的解决方案吗?如果我使用更多代码,我认为它会变得非常混乱......
public class DataGridMoveRowsUpCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
var grid = parameter as DataGrid;
if (grid != null && grid.SelectedItems.Count > 0) return true;
return false;
}
public void Execute(object parameter)
{
// Do sth...
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty);
}
}
//-------------------------------------------------------------
public class MyDataGrid : DataGrid
{
public static ICommand DataGridMoveRowsUp
{
get { return new DataGridMoveRowsUpCommand(); }
}
}
//-------------------------------------------------------------
<kbm:MyDataGrid x:Name="gridExpenses" ContextMenu="{StaticResource DataGridContextMenu}"/>
//-------------------------------------------------------------
<ContextMenu x:Key="DataGridContextMenu" x:Shared="true">
<MenuItem Header="{DynamicResource StringMoveUp}"
Command="kbm:MyDataGrid.DataGridMoveRowsUp"
CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">
</MenuItem>
...
答案 0 :(得分:2)
只要您觉得需要重新评估该命令,就必须手动调用RaiseCanExecuteChanged
方法。 (最有可能的情况是,dataGrid的SelectedItems
会发生变化。)
OR
您可以让CommandManager
通过挂钩到CanExecuteChanged
CommandManager事件来决定何时提出RequerySuggested
命令事件:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
RequerySuggested
事件发生时 System.Windows.Input.CommandManager检测可能的条件 改变命令执行的能力。