2015-08-13 1 views
1

У меня есть этот XAML код:Почему добавление команды двойного щелчка отключает мой datagrid?

<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> 

Это прекрасно работает без MouseDoubleClick EventTrigger. Но когда я добавил в способность двойного щелчка, сетка данных неожиданно появилась greyed, и строки больше не могли быть выбраны. Зачем?

+0

Как выглядит представление и инициализация ViewDetailsCommand? –

ответ

1

Ваш canExecuteMethod делегат должен быть возвращение ложным по какой-то причине, пересмотреть свой 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(); 
    } 
} 

Примечание выше, метод inviseation метода RaiseCanExecuteEvents, это удобный метод, в котором вы можете принудительно выполнить соответствующие проверки команд:

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