WPF中TreeView控制元件如何獲取選中的TreeViewItem物件?

bitfan發表於2009-03-06

WPF中TreeView控制元件如何獲取選中的TreeViewItem物件?

 

WPF的TreeView控制元件與過去的TreeView控制元件完全不同,幾乎是從頭重寫了一遍,其最重要的特點之一就是支援繫結到層次型資料。只需給其指定一個HierarchicalDataTemplate即可。非常方便。請看以下例子:

 

 <Window.Resources>
        <!--大學-->
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Academies}" DataType="{x:Type local:University}">
            <TextBlock Text="{Binding Path=UniversityName}"></TextBlock>
        </HierarchicalDataTemplate>
        <!--學院-->
         <HierarchicalDataTemplate ItemsSource="{Binding Path=Departments}" DataType="{x:Type local:Academy}">
            <TextBlock Text="{Binding Path=AcademyName}"></TextBlock>
        </HierarchicalDataTemplate>
        <!--系-->
        <DataTemplate DataType="{x:Type local:Department}">
            <TextBlock Text="{Binding Path=DepartmentName}"/>
        </DataTemplate>
      
    </Window.Resources>

 

其中,大學-->學院-->系,構成一個典型的物件層次。

以下XAML程式碼實現繫結:

<TreeView ……>
    <TreeViewItem ItemsSource="{Binding}" Header="大學列表">
 </TreeViewItem>

只需給TreeView的DataContext賦一個University的物件集合,就可以自動顯示:

 

 

 

 

然而,在寫這個小程式時,我發現了一個問題:當TreeView繫結到資料集合後,TreeView.SelectedItem返回的不是我預想中的TreeViewItem,而就是資料物件本身(如University,Academy等)。

這雖然方便了資料物件的提取,卻帶來其他的麻煩,比如,我可能需要將選中的節點加上紅色標記以突出顯示,或者是自動展開選中節點的子樹,或者訪問其父節點物件,這都需要獲取TreeViewItem物件。

我想了多種方法在TreeView本身的SelectedItemChanged事件中嘗試取出選中節點對應的TreeViewItem物件,均無功而返。

最後的解決方法很戲劇化,其實不根本需要鑽牛角尖,非要在SelectedItemChanged事件中幹這事。TreeViewItem本身有一個Selected事件,其引數e中就提供了需要的TreeViewItem物件。

於是,解決方案很簡單,在TreeView中響應TreeViewItem的附加事件Selected:

 

 <TreeView  Name="treeView1"  TreeViewItem.Selected="treeView1_Selected" ……>
<T/reeView>

 

其事件程式碼如下:

 


        private void treeView1_Selected(object sender, RoutedEventArgs e)
        {

           //e.OriginalSource 就是TreeViewItem物件,你可以將其儲存到窗體類的某個私有欄位中,或者直接使用它,如下所示:
            (e.OriginalSource as TreeViewItem).IsExpanded = true;
        }

 

搞定!

 

當前正在製作給企業培訓所用的WPF教學PPT,對其特性進行了較多的探索與應用,談些感觸:

WPF比原先的Windows Form靈活得多,有幾個特性我實在是非常欣賞:

(1)模板(包括控制元件模板與資料模板)

(2)資料繫結

(3)路由事件和依賴屬性

我個人認為,在Windows桌面應用領域,WPF遲早必將全面取代Windows Form。諸位.NET程式設計師可以提早做些準備。

 

 

 

 

 

相關文章