2010-06-29 10 views
7

Ich habe eine typische Treeview und ein Viewmodel. Das Ansichtsmodell enthält eine beobachtbare Sammlung anderer Ansichtsmodelle, die als Datenquelle für den Baum dienen.KeyBinding auf einem TreeViewItem

public class TreeViewVM { 
    public ObservableCollection<ItemVM> Items { get; private set; } 
    public ItemVM SelectedItem { get; set; } 
} 

und die 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; } 
} 

Aussicht:

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

Allerdings wird mein Befehl nicht egal aufgerufen werden, was ich versuche, so lange, wie es ist "innen" die HierarchicalDataTemplate .

Wenn ich die KeyBinding in der TreeView.InputBindings (und der ICommand/RelayCommand von der ItemVM in die TreeViewVM) alles ist schön, wird der Befehl aufgerufen.

Aber ich hätte gerne den Befehl auf der ItemVM (wie es ist, wo es Sinn macht). Irgendwelche Ideen?

Antwort

5

Die Schlüsselbindung müsste im TreeViewItem definiert werden, da dies das Element mit dem Fokus ist. Das Problem ist, dass Sie Tastenbelegungen nicht mit einem Style definieren können, was Sie hier wahrscheinlich tun würden.

Here ist eine Problemumgehung, die eine benutzerdefinierte angefügte Eigenschaft verwendet, um Objekte über einen Style zur InputBinding-Auflistung hinzuzufügen. Sie möchten also etwas verwenden, um Ihren Style zu definieren, den Sie TreeView.ItemContainerStyle zuweisen würden.

7

Aber ich hätte gerne den Befehl auf der ItemVM (wie es ist, wo es Sinn macht). Irgendwelche Ideen?

Wenn TreeViewVM das ausgewählte Element durch die SelectedItem Eigenschaft Spuren können Sie InputBindings auf TreeView definieren und haben immer noch die implementierten Befehle auf dem ItemVM:

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

Beachten Sie, wie die subproperty Syntax SelectedItem.Rename verwendet wird, die verwenden ItemVM als die Quelle der Bindung.

Leider ist es etwas mühsam, an das ausgewählte Element auf einem TreeView zu binden. Sie können nicht direkt an SelectedItem binden (wie Ihr XAML zu empfehlen scheint) aber es gibt various methods to overcome this limitation. Eine einfache Methode Ich mag ist Blend Interativity zu verwenden:

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

Sie müssen implementieren eine SetSeletectedItemCommand auf TreeViewVM, die die Eigenschaft setzt SelectedItem.

+0

Gut, danke! –

+0

Das hat super für mich funktioniert. Danke, dass du auf ** SelectedItem ** hingewiesen hast. –

+0

@MartinLiversage, bitte, siehe meine Frage http://stackoverflow.com/questions/36865204/keybinding-in-hierarchicaldatatemplate-of-treeview – StepUp