【发布时间】:2014-03-02 08:55:50
【问题描述】:
我想让我的 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>
...
【问题讨论】: