WPF中TreeView控件的用法
在WPF的TreeView使用方式和WinForm下有很大不同,那些展開某節(jié)點、獲取父節(jié)點,判斷某節(jié)點是否被選中等常用的操作在WinForm下都有相關函數(shù),而在WPF中卻不能輕易實現(xiàn)。
一種常規(guī)的方式是通過MVVM模式來將TreeViewItem節(jié)點中的IsSelect,IsExpanded等屬性來雙向綁定到要顯示的節(jié)點數(shù)據中,然后直接通過節(jié)點數(shù)據的屬性來實現(xiàn)相關操作。
但是,有的時候,當我們沒有ViewModel層,但又想像WinFrom那樣直接簡單的獲取或設置這些屬性的時候,該如何辦呢。其實WPF還是提供了類似WinForm中的這些設置的,只不過形式不一樣了而已,但是卻沒WinFrom的那么直觀和方便。CodeProject上就有人將常用函數(shù)總結了一下,寫成了擴展函數(shù),主要提供如下功能:
public static void SelectObject(this TreeView treeView, object obj) public static void SelectObject(this TreeView treeView, object obj, bool selected) public static bool IsObjectSelected(this TreeView treeView, object obj) public static bool IsObjectFocused(this TreeView treeView, object obj) public static void ExpandObject(this TreeView treeView, object obj) public static void ExpandObject(this TreeView treeView, object obj, bool expanded) public static bool IsObjectExpanded(this TreeView treeView, object obj) public static TreeViewItem GetParentItem(this TreeViewItem item)
文章地址如下:WPF TreeView tools
但是,這里面有一個小bug:當TreeView節(jié)點中使用延遲綁定的時候,根據數(shù)據節(jié)點獲取TreeItem會失敗。這里我把它修正了一下,感興趣的朋友可以直接使用我修改后的函數(shù)。
public static class TreeViewTools { /// <summary> /// Returns the TreeViewItem of a data bound object. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <returns>The TreeViewItem of the data bound object or null.</returns> public static TreeViewItem GetItemFromObject(this TreeView treeView, object obj) { try { DependencyObject dObject = GetContainerFormObject(treeView, obj); TreeViewItem tvi = dObject as TreeViewItem; while (tvi == null) { dObject = VisualTreeHelper.GetParent(dObject); tvi = dObject as TreeViewItem; } return tvi; } catch { } return null; } private static DependencyObject GetContainerFormObject(ItemsControl item, object obj) { if (item == null) return null; DependencyObject dObject = null; dObject = item.ItemContainerGenerator.ContainerFromItem(obj); if (dObject != null) return dObject; var query = from childItem in item.Items.Cast<object>() let childControl = item.ItemContainerGenerator.ContainerFromItem(childItem) as ItemsControl select GetContainerFormObject(childControl, obj); return query.FirstOrDefault(i => i != null); } /// <summary> /// Selects a data bound object of a TreeView. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> public static void SelectObject(this TreeView treeView, object obj) { treeView.SelectObject(obj, true); } /// <summary> /// Selects or deselects a data bound object of a TreeView. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <param name="selected">select or deselect</param> public static void SelectObject(this TreeView treeView, object obj, bool selected) { var tvi = treeView.GetItemFromObject(obj); if (tvi != null) { tvi.IsSelected = selected; } } /// <summary> /// Returns if a data bound object of a TreeView is selected. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <returns>Returns true if the object is selected, and false if it is not selected or obj is not in the tree.</returns> public static bool IsObjectSelected(this TreeView treeView, object obj) { var tvi = treeView.GetItemFromObject(obj); if (tvi != null) { return tvi.IsSelected; } return false; } /// <summary> /// Returns if a data bound object of a TreeView is focused. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <returns>Returns true if the object is focused, and false if it is not focused or obj is not in the tree.</returns> public static bool IsObjectFocused(this TreeView treeView, object obj) { var tvi = treeView.GetItemFromObject(obj); if (tvi != null) { return tvi.IsFocused; } return false; } /// <summary> /// Expands a data bound object of a TreeView. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> public static void ExpandObject(this TreeView treeView, object obj) { treeView.ExpandObject(obj, true); } /// <summary> /// Expands or collapses a data bound object of a TreeView. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <param name="expanded">expand or collapse</param> public static void ExpandObject(this TreeView treeView, object obj, bool expanded) { var tvi = treeView.GetItemFromObject(obj); if (tvi != null) { tvi.IsExpanded = expanded; if (expanded) { // update layout, so that following calls to f.e. SelectObject on child nodes will // find theire TreeViewNodes treeView.UpdateLayout(); } } } /// <summary> /// Returns if a douta bound object of a TreeView is expanded. /// </summary> /// <param name="treeView">TreeView</param> /// <param name="obj">Data bound object</param> /// <returns>Returns true if the object is expanded, and false if it is collapsed or obj is not in the tree.</returns> public static bool IsObjectExpanded(this TreeView treeView, object obj) { var tvi = treeView.GetItemFromObject(obj); if (tvi != null) { return tvi.IsExpanded; } return false; } /// <summary> /// Retuns the parent TreeViewItem. /// </summary> /// <param name="item">TreeViewItem</param> /// <returns>Parent TreeViewItem</returns> public static TreeViewItem GetParentItem(this TreeViewItem item) { var dObject = VisualTreeHelper.GetParent(item); TreeViewItem tvi = dObject as TreeViewItem; while (tvi == null) { dObject = VisualTreeHelper.GetParent(dObject); tvi = dObject as TreeViewItem; } return tvi; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C# 解決datagridview控件顯示大量數(shù)據拖拉卡頓問題
這篇文章主要介紹了C# 解決datagridview控件顯示大量數(shù)據拖拉卡頓問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01