2010-06-29 48 views
7

我有一個典型的treeview和viewmodel。視圖模型有一個可觀察的其他視圖模型集合,用作樹的數據源。TreeViewItem上的KeyBinding

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> 

但是我的命令不會不管我怎麼努力,只要它是援引 「內部」 的HierarchicalDataTemplate 。

如果我將TreeView.InputBindings中的KeyBinding(以及ItemVM中的ICommand/RelayCommand移動到TreeViewVM)都很好,則會調用該命令。

但我想在ItemVM上有命令(因爲它是有意義的)。有任何想法嗎?

回答

5

鍵綁定需要在TreeViewItem上定義,因爲這是具有焦點的元素。問題是你無法使用Style定義鍵綁定,這是你可能想在這裏做的。

Here是一種解決方法,它使用自定義附加屬性通過樣式將項目添加到InputBinding集合。所以你想使用類似的東西來定義你的Style,你將它分配給TreeView.ItemContainerStyle。

7

但我想在ItemVM上有命令(因爲它是有意義的)。有任何想法嗎?

如果TreeViewVM通過SelectedItem財產跟蹤選定的項目,你可以在TreeView定義InputBindings,仍然對ItemVM執行的命令:

<TreeView ItemsSource="{Binding Items}"> 
    <TreeView.InputBindings> 
    <KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/> 
    </TreeView.InputBindings> 
</TreeView> 

注意如何子屬性語法SelectedItem.Rename採用使用作爲綁定的來源的是ItemVM

不幸的是,綁定到TreeView上的選定項目稍微繁瑣。您不能直接綁定到SelectedItem(如您的XAML似乎建議),但存在various methods to overcome this limitation。一個簡單的方法我喜歡的是用Blend Interativity

<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> 

你將不得不實行SetSeletectedItemCommandTreeViewVM,設置屬性SelectedItem

+0

好的,謝謝! – 2013-01-23 14:00:53

+0

這對我很好。感謝您指出** SelectedItem **。重命名。 – 2014-04-02 14:43:14

+0

@MartinLiversage,請參閱我的問題 http://stackoverflow.com/questions/36865204/keybinding-in-hierarchicaldatatemplate-of-treeview – StepUp 2016-04-26 12:43:42