프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
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 프로퍼티가 있었군요. 야매로 익히다보니 미처 발견하지 못했네요. 좋은 정보 감사합니다 :)