Пытаюсь разобраться с привязкой "горячих" клавиш к дереву. Не получается передать в качестве параметра к команде саму выбранную ветку дерева. Хочу, чтобы при нажатии F2 открывалось окно редактирования наименования ветки дерева (или даже лучше не отдельного окна, а напрямую в самом дереве, но с этим как мне показалось еще более сложно. Хотя бы через дополнительное окно) На текущий момент через контекстное меню работает правильно, так как к каждому элементу дерева привязано свое контекстное меню и в качестве параметра эта ветка и передается. А вот с привязкой команды по горячей кнопке для меня оказалось сложнее. Команда объявлена в окне: Горячая клавиша объявлена в дереве: В качестве контекста у дерева в инициализации формы присваивается список: tp_View.DataContext = TPTree; public ObservableCollection TPTree = new ObservableCollection();
Который отдельно заполняется через другие команды. Что необходимо передать в CommandParameter, чтобы в команду e.Parameter помещался не весь список дерева, а только выбранный в данный момент? Или нужно делать вообще по другому и я не в ту сторону копаю? PS: Команда должна привязываться именно к дереву, так как на форме будет несколько деревьев и у каждого клавиша F2 должна вызывать редактирование именно своей ветки. Спасибо.
Ответ
У вас команда привязана ко всему TreeView, соответственно Binding возвращает TreeView.DataContext, а он может быть каким угодно. Решение очевидное - передавать явно текущий элемент TreeView Ну и так как при активном TreeView выбранного элемента может не быть - вы должны в коде команды первым делом проверить параметр: void RenameNode(NodeVm node)
{
if (node == null) return;
Либо составить правильный CanExecute, но это сложнее, думаю.
Так как же все-таки реализовать редактирование элемента прямо в дереве? Давайте попробуем сделать это! Я воспользуюсь паттерном MVVM, у меня есть соответствующие заготовки для классов команды: class DelegateCommand : ICommand
{
protected readonly Predicate
Комментариев нет:
Отправить комментарий