2011-05-05 59 views
1

我也可以解釋一下這個問題,並詢問如何從TreeView.Items中的Model對象中獲得TreeViewItem如何將元素聚焦在WPF TreeView中如果元素來自ItemSource?

我關注this tutorial而不是TreeViewItemsTreeView.Items集合我有該模型類的對象。

但是,我需要關注某些TreeView基於其他事件的元素。如果TreeView.Items包含TreeViewItems我很容易找到需要的,並使用其Focus()方法。但由於我現在使用綁定,我不知道該怎麼做。

當然,我可以通過編程添加TreeViewItems對象來填充TreeView,但是我試圖避免它,並遵循更多的WPF方式來處理綁定。

回答

5
TreeViewItem tvItem = (TreeViewItem)treeView 
          .ItemContainerGenerator 
          .ContainerFromItem(item); 
tvItem.Focus(); 
+0

謝謝!你必須把它轉換成TreeViewItem的唯一的東西 – 2011-05-06 11:45:48

+0

哦,你是對的,我會解決它。 – 2011-05-06 12:01:02

+0

請注意,在虛擬化的情況下容器可能爲空 – daVinci 2013-04-29 09:32:51

0

您可能需要使用ItemContainerGenerator.ContainerFromItem

在這裏找到一個帖子:http://bea.stollnitz.com/blog/?p=7

,並就如何使用它一個小樣本:

XAML

 <TreeView x:Name="tv" ItemsSource="{Binding MyDataList}" SelectedItemChanged="tv_SelectedItemChanged"> 
     <TreeView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding BusinessProperty}"/> 
      </DataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

代碼後面:

private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     var tvItem = tv.ItemContainerGenerator.ContainerFromItem(((TreeView)sender).SelectedItem); 
    } 

,然後做任何你想要與你的TreeView項:)

1
<Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
    <Setter Property="IsSelected" Value="{Binding IsSelectedInEditor, Mode=TwoWay}" /> 
    </Style> 

這是我的一個TreeViewItem在那裏我綁定的IsSelected屬性示範對象的IsSelectedInEditor屬性風格。也許這不是最好的辦法,但我發現它比其他解決方案更容易,並且它是開箱即用的。因此,在完成此設置後,您只需在TreeView.Items中找到您的對象,並將其IsSelectedInEditor(或您選擇的任何名稱)屬性設置爲true。

+0

這將控制「選擇」而不是「焦點」。沒有關注焦點的可綁定屬性。如果在樹中單擊,然後以編程方式選擇具有此綁定的另一個項目,則您單擊的項目周圍仍有一個淺色邊框,表明它仍保持聚焦狀態。 – 2015-07-13 16:45:24

+0

@SimonF現在我無法檢查我的代碼的有效性,但也許它在'11,但現在幾個wpf更新後可能不會。 – Ben 2015-07-22 17:26:16