代码之家  ›  专栏  ›  技术社区  ›  pidacrep

为什么添加双击命令会禁用数据网格?

  •  1
  • pidacrep  · 技术社区  · 9 年前

    我有此XAML代码:

    <DataGrid>
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
          <prism:InvokeCommandAction Command="{Binding AddedSelectedClaimsCommand}" TriggerParameterPath="AddedItems" />
          <prism:InvokeCommandAction Command="{Binding RemovedSelectedClaimsCommand}" TriggerParameterPath="RemovedItems" />                                
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseDoubleClick">
          <prism:InvokeCommandAction Command="{Binding ViewDetailsCommand}" />
        </i:EventTrigger>
      </i:Interaction.Triggers>
      <DataGrid.ContextMenu>
        <ContextMenu >
          <MenuItem Header="View details" Command="{Binding ViewDetailsCommand}"/>
        </ContextMenu>
      </DataGrid.ContextMenu>
    </DataGrid>
    

    它在没有鼠标双击事件触发器的情况下工作正常。但当我添加双击功能时,数据网格突然变灰,无法再选择行。为什么?

    1 回复  |  直到 9 年前
        1
  •  1
  •   E-Bat    9 年前

    您的canExecuteMethod委托由于某种原因必须返回false,请检查您的ViewModel并确保以下所有内容都为您准备就绪:

    在命令初始化中,确保设置canExecuteMethod委托以及命令操作:

    ViewDetailsCommand = new DelegateCommand(ExecuteViewDetailsCommand, 
        CanExecuteViewDetailsCommand);
    

    然后是验证是否满足执行此命令的前提条件的逻辑。最后,它将启用或禁用此命令的相关控件。

    private bool CanExecuteViewDetailsCommand() {       
        return null != SelectedDetail;
    }
    

    若命令成功通过了前提条件测试,则可以安全地执行其方法:

    private void ExecuteViewDetailsCommand()
    {    
        NavigateTo("DetailView",SelectedDetail);
    }
    

    您也应该有SelectedDetail属性(读/写):

    Detail selectedDetail;
    public Detail SelectedDetail 
    {
        get { return selectedDetail; }
        set { 
            SetProperty(ref selectedDetail, value); 
            RaiseCanExecuteEvents(); 
        }
    }
    

    注意以上RaiseCanExecuteEvents方法调用,这是一种方便的方法,您可以在其中强制相关命令验证:

    protected virtual void RaiseCanExecuteEvents()
    {
        ViewDetailsCommand.RaiseCanExecuteChanged();
    }