Я нашел частичный ответ на мою проблему. Я выяснил, каким образом мой код может определить, какая команда TextBlock была выполнена из ContextMenu. Вместо использования общего ContextMenu для трех TextBlocks, которым нужна эта команда, я создал отдельное ContextMenu для каждого TextBlock. Затем я добавил CommandParameter в пункт меню Копировать для этого TextBlock с именем свойства, которое я хотел скопировать. Затем в обработчике события CopyCommand_Executed я проверяю значение значения e.Parameter и копирую значение соответствующего элемента управления в буфер обмена. Это прекрасно работает.
Однако моя проблема с событиями CanExecute, которые не запускаются, пока я не выберу что-то в ComboBox, остается. Мне все еще нужно выяснить это.
Edit:
Что ж, теперь все работает нормально, включая события CanExecute. Я пробовал разные вещи, которые, должно быть, что-то ломали, но теперь, когда у меня работает CommandParameter, все остальное кажется нормальным. Я собираюсь отметить это как ответ.
Второе редактирование:
Ну, вообще-то, все работает на UserControl, над которым я работал, когда я публиковал это. Но все еще есть проблемы.
Упомянутый выше UserControl фактически встроен в другой UserControl. Первый контент UserControl содержится в StackPanel; Я установил StackPanel в качестве FocusScope, и, похоже, именно тогда все начало работать.
Второй элемент управления имеет StackPanel в корне и несколько сеток внутри него. Первый Grid содержит первый UserControl и некоторые другие вещи. Вторая Grid ниже, которая имеет две DataGrids с ContextMenus. Это ContextMenus, которые сейчас не работают.
Я сделал StackPanel FocusScope. Контекстные меню в первом UserControl не работают, если я не сделаю его FocusScope, поэтому он тоже один. Наконец, я сделал Grid, который содержит две DataGrids, FocusScope.
Я думаю, что проблема связана с FocusScopes, но я понятия не имею, как это связано, и никакая комбинация, которую я пробовал, не работает. Есть идеи?