2014-11-11 3 views
1

나는 TreeViews의 초보자입니다. WPF 스타일에서, 나는 세 가지 수준으로 구성 트 리뷰이 모든,이 시점에서자식 분기 또는 트리 뷰 (MVVM 스타일)의 리프에 바인딩하는 방법은 무엇입니까?

<TreeView ItemsSource="{Binding ReportTree}" > 
      <i:Interaction.Behaviors> 
       <tvb:TreeViewBehavior SelectedItem="{Binding SelectedTreeItem, Mode=TwoWay}" /> 
      </i:Interaction.Behaviors> 

다음 XAML에서

ReportName1 
    NetworkName1 
     PrinterName1 
     PrinterName2 
    NetworkName2 
     PrinterName3 
     PrinterName4 
ReportName2 
    .... 

을, 나는 뷰 모델에 트 리뷰의 selectedItem을 결합하는 상호 작용 행동을 사용하고 있습니다 기본 보고서 이름 아래에서 ANY 항목을 선택하면 ReportTree에서 항목을 보내는데 효과적입니다. 즉, PrinterName2를 선택하면 SelectedTreeItem이 ReportName1의 기본보기 모델이됩니다.

내가 알아야 할 것은 어떻게 PrinterName2가 PrinterName1과 반대되는 것으로 선택되었는지 알 수 있습니까?

내 최종 목표는 트리에서 임의의 리프 또는 분기를 선택하고 선택한 리프 또는 분기 만 제거하는 것입니다.

이 방법이 있습니까?

감사합니다.

답변

1

MouseBinding이 포함 된 TreeView에 간단한 DataTemplate을 사용하여이 문제를 해결할 수있는 한 가지 방법은 부모 ViewModel에서 select 명령을 호출하고 클릭 된 항목을 CommandParameter으로 전달하는 것입니다.

public class MainViewModel 
{ 
    public ObservableCollection<ItemViewModel> Items { get; private set; } 

    public ItemViewModel SelectedItem { get; set; } 

    public ICommand SelectItem { get; private set; } 

    public MainViewModel() 
    { 
     SelectItem = new LazyCommand<ItemViewModel>(ExecuteSelect); 
     Items = new ObservableCollection<ItemViewModel>();    
    } 

    private void ExecuteSelect(ItemViewModel item) 
    { 
     SelectedItem = item; 
    } 
} 

간단한 뷰 모델로 항목 : 당신의 ViewModel이 같은 보인다면

public class ItemViewModel 
{ 
    public ObservableCollection<ItemViewModel> Items { get; private set; } 

    public string Name { get; set; } 

    public ItemViewModel() 
    { 
     Items = new ObservableCollection<ItemViewModel>(); 
    } 
} 

그런 다음 당신이 가진 트 리뷰를 정의 할 수 HierarchicalDataTemplateItemTemplate로 :

<TreeView ItemsSource="{Binding Items}"> 
     <TreeView.ItemTemplate> 

      <HierarchicalDataTemplate ItemsSource="{Binding Items}" > 
       <TextBlock Text="{Binding Name}"> 
        <TextBlock.InputBindings> 
         <MouseBinding MouseAction="LeftClick" 
            Command="{Binding DataContext.SelectItem, RelativeSource={RelativeSource FindAncestor, AncestorType=TreeView}}" 
            CommandParameter="{Binding}" /> 
        </TextBlock.InputBindings> 
       </TextBlock> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

중요한 부분은 t 그는 TreeViews DataContext.SelectItemCommand 각 항목의 MouseBinding 및 매개 변수로 항목을 전달합니다. 그런 다음 ViewModel에서 선택 자체 (SelectedItem 등을 설정)를 처리 할 수 ​​있습니다.

+0

다음과 같이 정의 할 때 약간 분실되어 있습니다. SelectItem = new LazyCommand (ExecuteSelect); 감사. –

+1

안녕하세요 Alan, LazyCommand는 모든 MVVM 프레임 워크에서 찾을 수 있으므로 ICommand 인터페이스의 일반적인 구현입니다. 때로는 RelayCommand와 같이 다르게 호출됩니다. 당신은 ICommand 인터페이스와 일부 MVVM 프레임 워크에 익숙합니까? 그렇지 않은 경우 http://msdn.microsoft.com/en-us/magazine/dn237302.aspx를 참조하십시오. – Marc

+0

감사합니다. 한 가지는, (사소한 문제) TextBlock.InputBindings를 바인딩하면 TreeView SelectedItem 바인딩의 이전 작업 코드가 SelectedTreeItem에 바인딩되는 것 같습니다. SelectedTreeItem 속성은 설정되지 않습니다. 아이디어? –