Вопрос

У меня типичный 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top