꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 친절한티스

C#의 WPF로 툴을 만들다 보면 TreeView를 쓸때가 있습니다. 대략 요런것죠.



파일 디렉토리 구조라든가, 씬그래프 (SceneGraph) 라든가 유용하게 써먹을데가 많습니다. 코드로 보면 대략 이렇게 사용하겠죠.

TreeViewItem newItemC1 = new TreeViewItem();
newItemC1.Header = "카테고리1";
newItemC1.Items.Add("아이템1");
newItemC1.Items.Add("아이템2");
treeView1.Items.Add(newItemC1);

TreeViewItem newItemC2 = new TreeViewItem();
newItemC2.Header = "카테고리2";
newItemC2.Items.Add("아이템1");
newItemC2.Items.Add("아이템2");
treeView1.Items.Add(newItemC2);

좋습니다. TreeView 컨트롤을 사용하다 보면 이 중에 아이템이 선택되었을때 어떤 아이템이 선택되었는지 알아야 할때가 있어요.

private void OnDoubleClickItem(object sender, MouseButtonEventArgs e)
{
    TreeView treeView = sender as TreeView;
    if (null != treeView)
    {
        string selectedItemName = treeView.SelectedItem as string;
    }
}

간단하게 마우스 클릭 이벤트를 받아 TreeView의 SelectedItem을 얻어오면 됩니다. 그런데 아이템1을 선택했다고 하면, 이 아이템1이 카테고리1의 아이템1인지, 카테고리2의 아이템1인지는 어떻게 판별할 수 있을까라는 문제가 생깁니다.


( 아시는 분은 가르켜주세요 )


아래는 제가 사용한 방법입니다. 먼저, Helper 클래스를 하나 만듭니다. 추가할 오브젝트와 그리고 상위 TreeViewItem을 보관합니다.

public class TreeViewHelper
{
    public object Value
    {
        get { return mObj; }
    }
    public TreeViewItem ParentTree
    {
        get { return mParentTreeViewItem; }
    }
    private object mObj;
    private TreeViewItem mParentTreeViewItem;
    public TreeViewHelper(object obj, TreeViewItem parentTreeViewItem)
    {
        mObj = obj;
        mParentTreeViewItem = parentTreeViewItem;
    }
    public override string ToString()
    {
        return mObj.ToString();
    }
}

TreeViewItem에 아이템을 추가할때 이 Helper 클래스를 이용합니다.

TreeViewItem newItemC1 = new TreeViewItem();
newItemC1.Header = "카테고리1";
newItemC1.Items.Add(new TreeViewHelper("아이템1", newItemC1));
newItemC1.Items.Add(new TreeViewHelper("아이템2", newItemC1));
treeView1.Items.Add(newItemC1);

TreeViewItem newItemC2 = new TreeViewItem();
newItemC2.Header = "카테고리2";
newItemC2.Items.Add(new TreeViewHelper("아이템2", newItemC2));
newItemC2.Items.Add(new TreeViewHelper("아이템2", newItemC2));
treeView1.Items.Add(newItemC2);

이제 이 Helper 클래스를 통해 선택된 아이템의 값과 상위 TreeViewItem까지 조사할수 있게 되었습니다.

private void OnDoubleClickItem(object sender, MouseButtonEventArgs e)
{
    TreeView treeView = sender as TreeView;
    if (null == treeView)
        return;

    TreeViewHelper selectedItem = treeView.SelectedItem as TreeViewHelper;
    if (null == selectedItem)
        return;

    TreeViewItem selectedParentItem = selectedItem.ParentTree as TreeViewItem;
    if (null == selectedParentItem)
        return;

    string parentItemHeader = selectedParentItem.Header.ToString();
}

끝~



댓글을 달아 주세요

  1. jof4002 2012.08.11 00:40  댓글주소  수정/삭제  댓글쓰기

    http://stackoverflow.com/questions/470607/treeview-parent-node-value 이런건요?

    • Favicon of https://gamedevforever.com 친절한티스 2012.08.11 15:49 신고  댓글주소  수정/삭제

      이거는 아이템이 TreeViewItem 일때만 적용되더라구요. 위의 예에서의 아이템 같은 경우 string이기 때문에 VisualTreeHelper.GetParent를 이용한 부모 노드 구하기가 안되더라구요.

  2. ㅂㄹ 2012.08.11 01:21  댓글주소  수정/삭제  댓글쓰기

    저도 찾은김에.. http://social.msdn.microsoft.com/Forums/en-SG/wpf/thread/332833fc-11c9-44d7-8d09-ab081ac0f28a

  3. 마루 2012.08.13 01:07  댓글주소  수정/삭제  댓글쓰기

    string으로 받지 말고 treeviewitem으로 받으면 문제 해결일듯 하네요.

    • Favicon of https://gamedevforever.com 친절한티스 2012.08.13 14:37 신고  댓글주소  수정/삭제

      단순히 문자열만 뿌리고 사용 할거라면 모든 아이템을 treeviewitem 으로 사용해도 될겁니다. 하지만, 데이터 클래스 라든가 같은 다른 데이터 타입을 아이템으로 사용할거라면 위와 같은 문제가 생기더라구요.

    • 마루 2012.08.20 21:43  댓글주소  수정/삭제

      트리뷰 아이템을 더블클릭했는데 다른 클래스가 나오는 방식은 상당히 낯설군요. ^^;;
      저는 그런식으로 클래스를 넣는 것은 생각도 못해봤습니다. 클래스를 넣으니 되는군요. c#은 역시 다이나믹 하군요... ^^

      저의 경우는 트리뷰 아이템은 그대로 두고, 트리뷰아이템의 Tag에 필요한 클래스를 넣어 놓는 방법을 선호합니다. 이렇게 하면 기존의 데이터 구조는 유지하면 필요한 경우 새로운 데이터를 추가할 수 있습니다.

      원래 Tag 항목이 사용자가 필요한 정보를 넣어 놓을 수 있도록 제공해 주는 것입니다.

    • Favicon of https://gamedevforever.com 친절한티스 2012.08.23 09:43 신고  댓글주소  수정/삭제

      Tag 프로퍼티가 있었군요. 야매로 익히다보니 미처 발견하지 못했네요. 좋은 정보 감사합니다 :)