Здесь есть пара проблем.
Прежде всего, KeyBindings
будет работать, только если фокусированный в данный момент элемент расположен внутри элемента, в котором определены ключевые привязки.В вашем случае у вас есть фокус ListBoxItem
, но для дочернего элемента определены KeyBindings
- TextBlock
.Таким образом, определение KeyBindings
для TextBlock
не будет работать ни в коем случае, поскольку TextBlock не может получить фокус.
Во-вторых, вам, вероятно, нужно знать, что копировать, поэтому вам нужно передатьтекущий выбранный элемент журнала в качестве параметра для команды Copy
.
Более того, если вы определите ContextMenu
для элемента TextBlock
, он будет открыт только в том случае, если вы щелкнете правой кнопкой мыши именно по TextBlock
.Если вы щелкнете по любой другой части элемента списка, он не откроется.Итак, вам нужно определить ContextMenu
в самом элементе списка.
Учитывая все это, я думаю, что вы пытаетесь сделать, можно сделать следующим образом:
<ListBox ItemsSource="{Binding Logs, Mode=OneWay}"
x:Name="logListView"
IsSynchronizedWithCurrentItem="True">
<ListBox.InputBindings>
<KeyBinding Key="C"
Modifiers="Ctrl"
Command="Copy"
CommandParameter="{Binding Logs/}" />
</ListBox.InputBindings>
<ListBox.CommandBindings>
<CommandBinding Command="Copy"
Executed="CopyLogExecuted"
CanExecute="CanExecuteCopyLog" />
</ListBox.CommandBindings>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Command="Copy"
CommandParameter="{Binding}" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Здесь мы определяем KeyBinding
для самого ListBox
и указываем как CommandParameter
текущий выбранный элемент списка (запись в журнале).
CommandBinding
также определяется в ListBox
level, и это единая привязка как для меню правой кнопки мыши, так и для сочетания клавиш.
ContextMenu
, который мы определяем в стиле для ListBoxItem
и привязываем CommandParameter
к элементу данных, представленному этим ListBoxItem
(запись в журнале).
DataTemplate
просто объявляет TextBlock
с привязкой к текущему элементу данных.
И, наконец, в команде Copy
есть только один обработчиккод-позади:
private void CopyLogExecuted(object sender, ExecutedRoutedEventArgs e) {
var logItem = e.Parameter;
// Copy log item to the clipboard
}
private void CanExecuteCopyLog(object sender, CanExecuteRoutedEventArgs e) {
e.CanExecute = true;
}