WPF中TreeView控制元件如何獲取選中的TreeViewItem物件?
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程式設計師可以提早做些準備。
相關文章
- WPF中繼承ItemsControl子類控制元件資料模板獲取選中屬性中繼繼承控制元件
- WPF TreeView級聯複選View
- WPF執行緒中獲取控制元件的值和給控制元件賦值執行緒控制元件賦值
- [WPF]獲取控制元件間的相對位置控制元件
- WPF TreeView BringIntoViewBehaviorView
- 【Javascript】獲取選中的文字JavaScript
- Java 獲取Excel中的表單控制元件JavaExcel控制元件
- WPF中Ribbon控制元件的使用控制元件
- WPF中Popup控制元件的使用控制元件
- 【轉載】WPF中TreeView控制元件資料繫結和後臺動態新增資料(一)View控制元件
- JavaScript獲取選中checkbox核取方塊的選中值JavaScript
- Java中獲取Class物件的三種方式Java物件
- JavaScript獲取選中checkbox valueJavaScript
- WPF TreeView SelectedItemChanged called twiceView
- JavaScript 獲取選中checkbox核取方塊的值JavaScript
- WPF實現html中的table控制元件HTML控制元件
- WPF中3D控制元件的使用3D控制元件
- ACCESS TreeView控制元件的使用View控制元件
- 如何獲取 jenkins 中的憑證Jenkins
- 使用layui框架的select獲取選中的值UI框架
- 03 #### `__dict__` , 用於獲取物件中的成員物件
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- WPF中Datagrid控制元件新增行號控制元件
- JavaScript獲取選中radio單選按鈕值JavaScript
- 在js中獲取 input checkbox裡選中的多個值JS
- 反射獲取注入到spring中的類物件的工具類反射Spring物件
- JQuery 獲取select被選中的value和textjQuery
- 如何獲取 Linux 中的目錄大小Linux
- 如何在 Janus 中獲取 WebRTC 的流Web
- SOLIDWORKS如何獲取模型中的引數Solid模型
- python中獲取如何Series值Python
- Espresso 如何獲取控制元件的實時文字?Espresso控制元件
- jQuery 利用萬用字元獲取多選框選中的值jQuery字元
- Fresco的封裝和使用說明以及獲取快取中的Bitmap物件封裝快取物件
- jquery和bootstrap獲取checkbox選中的多行資料jQueryboot
- Rust中如何獲取最大字串?Rust字串
- 物件獲取原型物件物件原型
- PHP中如何獲取下拉選單的值PHP
- WPF TreeView IsExpanded 繫結不上的問題View