2009-03-24 8 views
7

WPF TreeView 내에서 TreeView 선택을 지우려면 어떻게해야합니까? TreeNodes을 반복하면서 IsSelected 속성을 지우려고했으나 ReadOnly 속성입니다. 어떤 아이디어?WPF TreeView 지우기 선택

TreeViewXMLDataProvider 개체를 통해 XML 바인딩을 사용하고 있습니다.

답변

8

TreeNodes의 의미를 명확히하지 못했습니다.

는 일반적으로 당신이보기에 결합 뷰 모델에 해당 IsSelected 재산 것 : 따라서

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

을, 당신은 당신의보기 모델의 데이터 항목을 통해 단지 루프가 IsSelected = false을 설정합니다.

그러나 이러한 속성이없는 것 같습니다. 그렇다면 각 데이터 항목에 해당하는 TreeViewItem을 가져와야합니다. 이렇게하는 방법에 대한 정보는 TreeView.ItemContainerGenerator 속성을 참조하십시오. 뭔가 같은 :

var treeViewItem = _treeView.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 
treeViewItem.IsSelected = false; 
+1

. 위 (ContainerFromIndex)에서 솔루션을 시도했지만 null을 반환합니다. 도움이 되었습니까? – Shimmy

2

선택한 항목을 찾아 값을 설정 :

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem; 
    if (tvi != null) 
    { 
    tvi.IsSelected = false; 
    } 
} 
10

내가 똑같은 문제를 가로 질러 와서 단 하나의 선으로, 어떤 트 리뷰에서 작동 다음과 같은 코드를 작성 첫 번째 함수를 호출하십시오.

class TomWrightsUtils 
{ 
    public static void ClearTreeViewSelection(TreeView tv) 
    { 
     if (tv != null) 
      ClearTreeViewItemsControlSelection(tv.Items, tv.ItemContainerGenerator); 
    } 
    private static void ClearTreeViewItemsControlSelection(ItemCollection ic, ItemContainerGenerator icg) 
    { 
     if ((ic != null) && (icg != null)) 
      for (int i = 0; i < ic.Count; i++) 
      { 
       TreeViewItem tvi = icg.ContainerFromIndex(i) as TreeViewItem; 
       if (tvi != null) 
       { 
        ClearTreeViewItemsControlSelection(tvi.Items, tvi.ItemContainerGenerator); 
        tvi.IsSelected = false; 
       } 
      } 
    } 
} 
+1

이 때까지 아무 일도 없었습니다. 완전한! 고맙습니다! – StinkyCat

0

이것은 지금까지는 효과가있는 것처럼 보였지만 5 분 전처럼 사용 했으므로 위험 부담을 감수하십시오. 기본적으로 트리 컨트롤에서 사용자가 클릭 할 때 선택을 지우고 싶지만 트리 항목에서는 선택하지 않으려합니다. 당신은 표준 ItemContainerGenerator 멀리 내 경험이었다가 n보다 더 깊이 노드에 실패하기 때문에 호출 것

youTreeview.ClearSelection(); 

using System.Windows.Forms; 
using System.Windows.Controls; 

namespace YourAppNamespace 
{ 
    public static void ClearSelection(this TreeView input) 
    { 
    // this should be some container that you put in 
    // possibly the actual treeviewitem, not sure on that though 
    var selected = input.SelectedItem; 
    if (selected == null) 
     return; 

    // in my case this works perfectly 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    if (tvi == null) 
    { 
     // it must be a child, heres a hack fix 
     // my nodes are inherited from TreeViewItemViewModel by Josh Smith 
     var child = selected as WPF.Controls.TreeViewItemViewModel; 
     if (child == null) 
      return; 
     child.IsSelected = false; 

    } 
    else 
     tvi.IsSelected = false; 
    } 


} 
+0

내 코드를 무시하십시오. 루트 수준에서만 작동합니다. 선택된 모든 하위 노드는 지워지지 않습니다. –

2

이것은 확장자 방법으로 밖으로 좋은 작품 +1. 아래의 확장 방법을 조합하여 사용합니다. ContainerFromItem 확장 메서드는 MSDN 블로그에서 제공되며 TreeView를 다룰 때 나를 놀라게했습니다. 나는 오랫동안 찾고 후 사용자 정의 트리 목록보기 구현이 상황에 자신을 실행중인

public static void ClearSelection(this TreeView input) 
    { 
    var selected = input.SelectedItem; 

    if (selected == null) return; 

    var tvi = input.ContainerFromItem(selected) as TreeViewItem; 

    if (tvi == null) return; 

    tvi.IsSelected = false; 

    } 

    public static TreeViewItem ContainerFromItem(this TreeView treeView, object item) 
    { 
    TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item); 
    if (containerThatMightContainItem != null) 
     return containerThatMightContainItem; 
    else 
     return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item); 
    } 

    private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item) 
    { 
    foreach (object curChildItem in itemCollection) 
    { 
     TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem); 
     if (parentContainer == null) 
      return null; 
     TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item); 
     if (containerThatMightContainItem != null) 
      return containerThatMightContainItem; 
     TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item); 
     if (recursionResult != null) 
      return recursionResult; 
    } 
    return null; 
    } 
1

호출 할 수 있도록

void DestinationTree_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeView tree = sender as TreeView; 
    DestinationClientViewModel selectedItem = tree.SelectedItem as DestinationClientViewModel; 

    if (selectedItem != null) 
    { 
     int selectedItemIndex = this.DestinationTree.Items.IndexOf(selectedItem); 

     if (selectedItemIndex > -1) 
     { 
      TreeViewItem tvi = this.DestinationTree.ItemContainerGenerator.ContainerFromIndex(selectedItemIndex) as TreeViewItem; 
      if (tvi != null) 
       tvi.IsSelected = false; 
     } 
    } 
} 
0

드디어 나를 위해 일한 해결책을 발견했다.

전체 설명

는 당신이 TreeViewItem.Selected 이벤트를 캡처하고 트 리뷰에 Tag 속성으로 이벤트의 소스를 저장한다 http://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a-treeview

기본 개념에서 찾을 수 있습니다. 그런 다음 지우려면 컨트롤의 Tag 특성에 액세스하고 IsSelected 값을 False로 설정합니다. 이 중첩 된 어린이의 2 단계와 나를 위해 작동합니다. 잘하면 그것은 당신을 위해 작동합니다.지속성 위해서

:

트 리뷰 선언

<TreeView Name="myTreeView" TreeViewItem.Selected="OnItemSelected" 
    ItemsSource="{Binding Source={StaticResource myHierarchicalData}}"/> 

이벤트 처리기

private void OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    myTreeView.Tag = e.OriginalSource; 
} 

지우기 선택 로직은

if (myTreeView.SelectedItem != null) 
{ 
    TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem; 
    // add your code here mine was selectedTVI.IsSelected = false; 
} 
0

난 그냥 같은 문제를 가로 질러왔다.

나는 필사적으로 트 리뷰의 첫 번째 인덱스를 선택하는 방법을 찾고 있어요 신속하고 더러운 솔루션

tree.ItemsSource = null; 

tree.ItemsSource = yourSource; 
0
TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 

if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; }