2014-02-05 1 views
1

사용자가 선택한 행을 위 또는 아래로 이동할 수있는 상황에 맞는 메뉴를 사용하여 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> 
     ... 

답변

1

당신은 당신이 그 명령을 재평가 할 필요가 기분 때마다 수동으로 RaiseCanExecuteChanged 방법을 호출해야 ... 그것은 거대한 엉망이 될 것이라 생각합니다.

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
이 같은 CommandManager의의 RequerySuggested 이벤트에 접선하여 명령의 CanExecuteChanged 이벤트를 발생시킬 때 (. 대부분의 아마 경우에 데이터 그리드의 SelectedItems이 변경됩니다)

또는

는 어느 쪽이든 당신은 CommandManager하도록 할 수는 결정

RequerySuggested 이벤트 System.Windows.Input.CommandManager가 의 쉼표 변경 가능 조건을 감지하면 발생합니다 실행할 것이다.

+1

감사합니다. 당신의 제 2의 제안을 사용해서 나는 그 것을 작동하게 만들었다. 나는'CanExecute()'를 재평가 할 필요가있을 때'CommandManager'가 어떻게 이해하는지 모르겠지만 또 다른 이슈입니다! :) – NoOne

관련 문제