2012-08-03 2 views
0

서문 :이벤트 처리기를 부착하는 것은 동적으로 생성하는 TreeViewItems

나는 다음과 같은 XAML이 다음 .NET 코드 숨김

<controls:TreeView x:Name="tv"> 
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <controls:TreeViewItem Header="{Binding TextToBindTo}" Selected="TreeViewItem_Selected" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </controls:TreeViewItem> 
</controls:TreeView> 

그리고 :

_viewCollection = New CollectionViewSource() 
_viewCollection.Source = _data.RoleList 
tvi.ItemsSource = _viewCollection.View 

문제 :

tvi의 자식 (데이터 바인딩을 기반으로 동적으로 생성 된) Selected 이벤트에 이벤트 처리기를 연결하려고합니다.

Selected="..." 마크 업 (XAML에 나와있는 것처럼)을 사용하려고 시도했지만 작동하지 않습니다.

질문 :

이 가 어떻게이을 수행 할 수 있습니다

?

답변

1

내가 선택한 이벤트가 중첩 된 TreeViewItem에 처리되지 않는 이유는 모르겠지만, 우리는 그것에게 트 리뷰에 ItemsSource를 설정하는 것이 조금 변경하는 경우, 그것은 처리됩니까 :

<controls:TreeView x:Name="tv" SelectedItemChanged="tv_SelectedItemChanged"> 
     <controls:TreeView.ItemTemplate> 
      <DataTemplate> 
       <!-- this Selected event handler does get called --> 
       <controls:TreeViewItem Header="{Binding Name}" Selected="TreeViewItem_Selected" > 
... 

그러나 발생 된 이벤트에는 항목에 대한 유용한 정보가 포함되어 있지 않으므로 해당 이벤트에서 유용한 정보를 유용하게 파생시킬 수 없습니다. 중첩 여부 -

Setting a handler for the SelectedItemChanged event on the TreeView works and also contains the usual OldValue and NewValue properties in the EventArgs.

이벤트는 모든 TreeViewItems에 대해 발생합니다.

이 시도 :

<controls:TreeView x:Name="tv" SelectedItemChanged="tv_SelectedItemChanged"> 
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True" Selected="TreeViewItem_Selected" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <controls:TreeViewItem Header="{Binding}" Selected="TreeViewItem_Selected" > 
        <Border Background="Black" Height="25" Width="25" /> 
       </controls:TreeViewItem> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </controls:TreeViewItem> 
</controls:TreeView> 

...

void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    tvi.ItemsSource = GetItems(); 

} 

private IEnumerable GetItems() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     yield return i; 
    } 
} 

private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    var oldItem = e.OldValue; 
    var newItem = e.NewValue; 
} 
+0

감사합니다! 나는 TreeViewItem의'Selected' 이벤트 대신에 TreeView의'SelectedItemchanged' 이벤트로 끝났다. –

+1

sdk : TreeView.ItemTemplate 및 sdk : HierarchicalDataTemplate을 사용할 때 각 TreeViewItem에 확장 이벤트 처리기를 연결하려고합니다. 어떻게하는지에 대한 아이디어가 있습니까? – Number8

+0

@ Number8 : 그 작업에 대한 해결책을 찾았습니까? – wollud1969

관련 문제