Keybinding на дереверет
-
01-10-2019 - |
Вопрос
У меня типичный TreeView и ViewModel. ViewModel имеет наблюдаемую коллекцию других просмотра модернов, которые служат источником данных для дерева.
public class TreeViewVM {
public ObservableCollection<ItemVM> Items { get; private set; }
public ItemVM SelectedItem { get; set; }
}
и itemvm:
public class ItemVM {
public string Name { get; set; }
public ImageSource Image { get; private set; }
public ObservableCollection<ItemVM> Children { get; private set; }
public ICommand Rename { get; private set; }
}
Вид :
<TreeView Selecteditem="{Binding SelectedItem}" ItemsSource="{Binding Items}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.InputBindings>
<KeyBinding Key="F2" Command="{Binding Rename}"/>
</StackPanel.InputBindings>
<Image Source="{Binding Image}"/>
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Однако моя команда не будет вызвана независимо от того, что я пытаюсь так долго, как это «внутри» иерархикататуэтермена.
Если я перемещаю кнопку Keybinding в TreeView.inputbindings (и Icommand / RelayCommand от ItemVM к TreeViewVM) Все приятно, команда вызывается.
Но я хотел бы иметь команду на itemVm (как это имеет место, где это имеет смысл). Есть идеи?
Решение
Ключевое связывание необходимо будет определить на дереверевевиете, так как это элемент с фокусом. Проблема в том, что вы не можете определить привязки ключей с помощью стиля, который вы, вероятно, хотете сделать здесь.
Здесь Это один из разрабатываний, который использует пользовательское прилагаемое свойство для добавления элементов в коллекцию ввода ввода через стиль. Таким образом, вы хотите использовать что-то вроде этого для определения вашего стиля, который вы присваиваете TreeView.itemcontainerStyle.
Другие советы
Но я хотел бы иметь команду на itemVm (как это имеет место, где это имеет смысл). Есть идеи?
Если TreeViewVM
отслеживает выбранный элемент через SelectedItem
Имущество вы можете определить InputBindings
на TreeView
и все еще есть команды, реализованные на ItemVM
:
<TreeView ItemsSource="{Binding Items}">
<TreeView.InputBindings>
<KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
</TreeView.InputBindings>
</TreeView>
Обратите внимание, как синтаксис подпросердера SelectedItem.Rename
используется для использования ItemVM
как источник связывания.
К сожалению, немного утомительно связываться с выбранным предметом на TreeView
. Отказ Вы не можете связаться напрямую SelectedItem
(Как кажется, ваш XAML предложить) но существует Различные методы для преодоления этого ограничения.
Один простой метод должен использовать Смешайте интерактивность:
<TreeView Name="treeView" ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding SetSelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=treeView}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
Вам придется реализовать SetSeletectedItemCommand
на TreeViewVM
это устанавливает свойство SelectedItem
.