2015-02-28 5 views
0

У меня есть ListView с некоторыми KeyBindings, которые позволяют пользователю перемещать и удалять записи с помощью сочетаний клавиш. Однако я не хочу, чтобы привязки были доступны все время.Может ли WPF DataTrigger деактивировать KeyBinding?

Элементы управления кнопками для добавления, удаления и перемещения записей имеют свою видимость, связанную с выбором ComboBox (только некоторые пользователи могут редактировать). Я хочу, чтобы сочетания клавиш деактивировались на основе выбора окна.

Я не был в состоянии найти информацию о том, возможно ли это еще. Ребята, что вы думаете?

<ComboBox x:Name="TesterIdentityBox" ItemsSource="{Binding Path=TesterIdentityList, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name" SelectedItem="{Binding Path=TesterIdentitySelection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding TesterIdentityIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

<ListView ItemsSource="{Binding TestViewList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding SelectedTestIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=SelectedTest}"> 
    <ListView.InputBindings> 
     <KeyBinding Key="Up" Command="{Binding Path=MoveTestUpCommand}" CommandParameter="{Binding Path=SelectedTest.Description}" /> 
     <KeyBinding Key="Down" Command="{Binding Path=MoveTestDownCommand}" CommandParameter="{Binding Path=SelectedTest.Description}" /> 
     <KeyBinding Key="Delete" Command="{Binding Path=RemoveTestCommand}" /> 
    </ListView.InputBindings> 

Я использовал стиль сеттеров с DataTriggers, чтобы изменить видимость кнопки команд, но я не знаю, что (если что) является эквивалентом для невизуального элемента, как KeyBinding.

ответ

1

Самый простой способ в этом случае было бы реализовать CanExecute() методы в вашем MoveTestUpCommand, MoveTestDownCommand и RemoveTestCommand. Эти методы должны возвращать false, когда вы не хотите, чтобы пользователь мог выполнять эти действия. Таким образом, ваш KeyBinding s не будет иметь эффекта, поскольку команды не будут выполнены.

Если ваши кнопки 'Command свойства также привязаны к этим командам, эти кнопки будут автоматически обновлять их доступность (IsEnabled) в соответствии с возвращаемыми значениями CanExecute(). Чтобы обновить состояние представления из viewmodel, просто вызовите методы RaiseCanExecuteChanged() в соответствующих командах (это зависит от вашей реализации ICommand).

Чтобы установить видимость кнопки в соответствии с его доступностью, вы могли бы использовать что-то вроде:

<Button 
    Command = "{Binding SampleCommand}" 
    Visibility = "{Binding IsEnabled, RelativeSource = {RelativeSource Self}, Converter = {StaticResource BooleanToVisibilityConverter}}"/> 

Там является реализация BooleanToVisibilityConverter в System.Windows.Controls.

+0

Да, я забыл о CanExecute. Я почти никогда не использую его, но он отлично работает здесь. Я решил не менять другие привязки, так как у меня уже есть контролер видимости, но я запомню это в следующий раз. Большое спасибо. –

+0

После некоторого тестирования я заметил, что моя кнопка «Удалить» была отключена, как вы упомянули, но она была отключена все время, даже если CanExecute был правдой. Я думал, что это может быть из пользовательского интерфейса, который не обновляется, но моя реализация, похоже, не включает функцию RaiseCanExecuteChanged. Легким решением для меня было просто удалить CanExecute и изменить его на проверку внутри самой функции remove. Теперь ключ и кнопка имеют правильное поведение. –

+0

Эта проблема вернулась, чтобы преследовать меня после того, как кто-то специально попросил меня вернуться к методу CanExecute. После того, как я задал новый вопрос, я понял, что это была комбинация логических ошибок с моей стороны: http://stackoverflow.com/questions/28910262/wpf-canexecute-is-always-disabled/28974807#28974807 –

Смежные вопросы