사용자가 선택한 행을 위 또는 아래로 이동할 수있는 상황에 맞는 메뉴를 사용하여 DataGrid를 갖기를 원했습니다. 검색을 한 후에 문제가있는 다음 코드를 생각해 냈습니다. CanExecute
은 한 번만 호출됩니다 (메뉴가 생성되면 추측됩니다). 따라서 내 MenuItem이 활성화되거나 비활성화됩니다. 항상입니다. 달성하기 위해 고심하고있는 것은 DataGrid에서 선택된 행이 있고 없을 때 사용할 수 없도록 설정하는 것입니다. 현재 이것은 작동하지 않습니다.WPF - DataGrid의 ContextMenu에 대해 CanExecute가 작동하지 않습니다.
더 나은 해결책이 있습니까? 내가 더 많은 코드를 사용하는 경우 나는
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>
...
감사합니다. 당신의 제 2의 제안을 사용해서 나는 그 것을 작동하게 만들었다. 나는'CanExecute()'를 재평가 할 필요가있을 때'CommandManager'가 어떻게 이해하는지 모르겠지만 또 다른 이슈입니다! :) – NoOne