2010-06-29 4 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 (및 ItemVM에서 TreeViewVM으로의 ICommand/RelayCommand)에서 KeyBinding을 모두 움직이는 것이 좋습니다. 명령이 호출됩니다.

하지만 ItemVM에서 명령을 사용하고 싶습니다. 어떤 아이디어?

답변

5

키 바인딩은 포커스가있는 요소이므로 TreeViewItem에 정의해야합니다. 문제는 스타일을 사용하여 키 바인딩을 정의 할 수 없다는 것입니다.

Here은 사용자 지정 연결 속성을 사용하여 스타일을 통해 항목을 InputBinding 컬렉션에 추가하는 한 가지 해결 방법입니다. 그래서 당신은 TreeView.ItemContainerStyle에 할당 할 스타일을 정의하기 위해 이와 비슷한 것을 사용하고 싶을 것입니다.

7

그러나 ItemVM에서 명령을 사용하고 싶습니다. 어떤 아이디어? TreeViewVMSelectedItem 속성을 통해 선택한 항목을 추적하는 경우

당신은 TreeViewInputBindings를 정의 할 수 있습니다 여전히 명령은 ItemVM에 구현이 : 하위 속성 구문 SelectedItem.Rename이를 사용하기 위해 사용하는 방법을

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

공지 사항 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> 

당신은 SetSeletectedItemCommand 재산 SelectedItem을 설정 TreeViewVM에 구현해야합니다.

+0

감사합니다. –

+0

이것은 나를 위해 훌륭했습니다. ** SelectedItem **. Rename을 지적 해 주셔서 감사합니다. –

+0

@MartinLiversage 제발, 내 질문보기 http://stackoverflow.com/questions/36865204/keybinding-in-hierarchicaldatatemplate-of-treeview – StepUp